仓库建设(ZJOI2007)

本文通过一道具体题目解析了斜率优化动态规划的实现过程。文章详细介绍了算法思想,并提供了完整的Pascal代码示例,包括如何维护凸包、更新状态等关键步骤。
算法:DP
 
分析:搞了半个上午的这道题,然后查知识发现是斜率优化,弄了半天还是弄不懂。
      不过还算有一些收获……

program storage;



const 

 maxn=1000001;



var 

 n,i,j,h,t:longint;

 f,s,y,p,x,w,c:array[0..maxn] of int64;

 q:array[0..maxn] of longint;



function pan(j,k:longint):boolean;

begin

 if y[j]-y[k]+x[i]*(w[j]-w[k])>=0 then exit(true) else exit(false);

end;



function cha(i,j,k:longint):boolean;

begin

 if (y[j]-y[i])*(w[k]-w[j])-(y[k]-y[j])*(w[j]-w[i])<=0 then exit(true) else exit(false);

end;



begin

 assign(input,'storage.in'); reset(input);

 assign(output,'storage.out'); rewrite(output);



 readln(n);

 for i:=1 to n do

  begin

   readln(x[i],p[i],c[i]);

   p[i]:=p[i-1]+p[i]; 

   s[i]:=s[i-1]+p[i-1]*(x[i]-x[i-1]);

  end;



 for i:=1 to n do

  begin

   while (h<t) and (pan(q[h],q[h+1])) do inc(h);

   j:=q[h];

   f[i]:=f[j]+s[i]-s[j]-p[j]*(x[i]-x[j])+c[i];

   y[i]:=f[i]-s[i]+p[i]*x[i];

   w[i]:=-p[i];

   while (h<t) and (cha(q[t-1],q[t],i)) do dec(t);

   inc(t); 

   q[t]:=i;

  end;



 writeln(f[n]);



 close(input); close(output);

end.                                 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值