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