做题之前一定要慎重思考!!

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


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值