bzoj 1613 dp

题意:n分钟,每分钟可以选择跑di米同时疲劳加1或者一直休息同时恢复疲劳减1,但要一直休息到疲劳值为0。在疲劳值为0的时候休息,疲劳值不变,开始时疲劳值为0。要求结束时疲劳值为0,求最多能跑多少米

很容易的dp呀,O(n*m):

f[i,j]表示第i分钟的疲劳值为j时最多跑多少米

转移:f[i,j]=f[i-1,j-1]+d[i]

           f[i,0]=f[i-1,0]

           f[i,0]=max{f[i,0],f[i-j,j]}  (j<=i)

最终答案:f[n,0]

吐槽:mdzz,果然刚起床五分钟之内不适合做题,没看见要一直休息到疲劳值为0的要求,一直wa = =

var
        n,m             :longint;
        i,j             :longint;
        d               :array[0..10010] of longint;
        f               :array[0..10010,0..510] of longint;
function max(a,b:longint):longint;
begin
   if a<b then exit(b) else exit(a);
end;

begin
   read(n,m);
   for i:=1 to n do read(d[i]);
   for i:=1 to n do
   begin
      f[i,0]:=f[i-1,0];
      for j:=1 to m do
      begin
         f[i,j]:=f[i-1,j-1]+d[i];
         if i-j>=0 then f[i,0]:=max(f[i,0],f[i-j,j]);
      end;
   end;
   writeln(f[n,0]);
end.
——by Eirlys



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值