我今天写了一个宽搜的题,写了半天,最终修改了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.