题意: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