Я тем временем еще немного повозился со своим "деревянным" алгоритмом, в нем можно достичь значительных успехов, потребовав не только глобального соответствия эвристике
, но и локального соответствия более мягкой типа
. Например, кусок кода ниже, за пару минут правильно посчитает все минимальные
:
(код)
cz_eurzh1(n)={my(sn=ceil(5*n/3)+7,px=9,
Rcurr=matrix(1,3,i,j,[1,0,px][j]),
Rnext=matrix(px,4),
spx=0,k0=1,
R,s,m,rnk,rnkm,mk,snk,dspx,kin,her);
printp(["n","R_min","R_max","#","m_max"]);
for(i=1,n,
a=matsize(Rcurr)[1];
if(i>1,printp([i-1,vecmin(Rcurr[1..a,1]),vecmax(Rcurr[1..a,1]),a,vecmax(Rcurr[1..a,4..i+2])])
,printp([i-1,vecmin(Rcurr[1..a,1]),vecmax(Rcurr[1..a,1]),a]));
\\if(i>=107,printp(Rcurr));
for(j=1,a,
R=Rcurr[j,1];
s=Rcurr[j,2];
px=Rcurr[j,3];
if(i>1,m=Rcurr[j,4..i+2]);
if(px>=1,
if(i==1,f=2,f=1-R%3);
for(k=1,px,
mk=2*k+f;
rnk=(R<<mk-1)/3; rnkm=rnk%3;
snk=s+mk;
her=5+ceil((ceil(5*(i+1)/3)+7-snk)/2);
\\if(i>=45,her=her+2);
\\if(i>=50,her=her-1);
\\if(i>=67,her=her-1);
dspx=if(rnkm==1,min(floor((sn-snk-n+i+1)/2),her),
rnkm==2,min(ceil((sn-snk-n+i+1)/2),her),
rnkm==0,0);
if(dspx>0,spx=spx+dspx);
kin=k+k0-1;
Rnext[kin,1]=rnk;
Rnext[kin,2]=snk;
Rnext[kin,3]=dspx;
Rnext[kin,i+3]=mk;
if(i>1,for(v=4,i+2,Rnext[kin,v]=m[v-3]));
);
k0=k0+px;
);
);
Rcurr=Rnext;
\\printp(Rcurr);
Rnext=matrix(spx,i+4);
spx=0;
k0=1;
);
a=matsize(Rcurr)[1];
printp([n,vecmin(Rcurr[1..a,1]),vecmax(Rcurr[1..a,1]),a,vecmax(Rcurr[1..a,4..n+3])]);
printp(Rcurr);
};
А если раскомментировать жульнический кусок кода (опирающийся на известный результат для
)
if(i>=45,her=her+2);
if(i>=50,her=her-1);
if(i>=67,her=her-1);во внутреннем цикле (позволяющий иногда
быть побольше), то так же за минуты правильно посчитает и
многие (не все) минимальные
, а начиная с
уже окончательно пойдет вразнос.
Проблема, конечно, в том, как определить, когда именно требуется ослабить локальное ограничение, а когда снова можно установить его построже, это непонятно