BZOJ-1010 玩具装箱

DP+斜率优化

DP方程为dp[i]:=max(dp[j]+sum[i]-sum[j]+i-j-1)(j<i)

然后斜率优化。。。。

 

  • var

  • n,i,l,s,t,a,b,c:longint;

  • num,dp,xl,sum:array[0..50005] of int64;

  •  

  • begin

  • read(n,l);

  • for i:=1 to n do read(num[i]);

  • for i:=1 to n do sum[i]:=sum[i-1]+num[i];

  • for i:=1 to n do sum[i]:=sum[i]+i;

  • s:=1;t:=1;

  • for i:=1 to n do

  •   begin

  •   while s<t do

  •     begin

  •     a:=xl[s];

  •     b:=xl[s+1];

  •     if 2*(sum[i]-1-l) > ((dp[b]-dp[a]+sum[b]*sum[b]-sum[a]*sum[a])/(sum[b]-sum[a])) then

  •       begin

  •       xl[s]:=0;inc(s);

  •       end

  •     else break;

  •     end;

  •   a:=xl[s];

  •   dp[i]:=dp[a]+(sum[i]-sum[a]-l-1)*(sum[i]-sum[a]-l-1);

  •   inc(t);

  •   xl[t]:=i;

  •   while t-s>1 do

  •     begin

  •     a:=xl[t-2];b:=xl[t-1];c:=xl[t];

  •     if (dp[b]-dp[a]+sum[b]*sum[b]-sum[a]*sum[a])/(sum[b]-sum[a]) >

  •        (dp[c]-dp[b]+sum[c]*sum[c]-sum[b]*sum[b])/(sum[c]-sum[b]) then

  •       begin

  •       xl[t-1]:=xl[t];xl[t]:=0;dec(t);

  •       end

  •     else break;

  •     end;

  •   end;

  • write(dp[n]);

  • end.

 

posted @ 2014-07-01 11:46  NanoApe  阅读(129)  评论(0编辑  收藏  举报
AmazingCounters.com