我今天写了一个宽搜的题,写了半天,最终修改了N次才对。
后来回头一想,有更简单的方法
用这么一个玩意:a:=@b;
然后a^实际上就是b这个数组了,在做高维DP的时候如果你写个F【I,J,K,L,。。。。。。】估计程序会很恐怖,可以用这个来优化下代码量,而且速度估计也会快一点。
var n,m,min,i,j,r,h:longint; mins,minv:array[0..30] of longint; procedure dfs(floor,v,ri,hi,s:longint); var i,r,h,ss,maxv:longint; begin if v<minv[floor] then exit; if s+mins[floor]>=min then exit; maxv:=0; for i:=floor downto 1 do maxv:=maxv+(ri-i)*(ri-i)*(hi-i); if maxv<v then exit; if floor=0 then begin ss:=s+ri*ri; if ss<min then min:=ss; exit; end; for r:=ri-1 downto floor do for h:=hi-1 downto floor do dfs(floor-1,v-r*r*h,r,h,s+ri*ri-r*r+2*r*h); end; begin read(n,m); min:=maxlongint; mins[0]:=1; minv[0]:=0; for i:=1 to m do begin mins[i]:=2*i*i+mins[i-1]+2*i-1; minv[i]:=minv[i-1]+i*i*i; end; for r:=m to 30 do for h:=m to 30 do dfs(m-1,n-r*r*h,r,h,2*r*h); writeln(min); end.