看起来不是很难,一道动规题(话说最近一直在刷动规题啊)
一开始只想到两个动规方程:
f[i,j]表示第i分钟,疲劳度为j所能跑的最大距离。
我们有:
f[i,j]:=f[i-1,j-1]+s[i];
f[i+j,0]:=max(f[i+j,0],f[i,j]);(若从此状态开始休息,那么他的距离是和f[i+j,0]一样的)
后面想想不对,还少了一个方程。
因为如果你休息到疲劳度为0,那么你即可以选择跑步,也可以选择继续休息,所以我们还有一个方程:
f[i,0]:=max(f[i-1,0],f[i,0])。
这样就好了。
其实第二个方程还可以写成另一种形式:f[i,j]:=max(f[i,j],f[i-j,0])。其实是一个意思,只不过是一个是从现在推出将来,另一个是从过去推出现在。
接下来就很容易了。
1 program p1023; uses math; 2 var 3 i,j,k,l,m,n:longint; 4 s:array[0..20]of longint; 5 f:array[0..20,0..50]of longint; 6 begin 7 read(n,m); 8 for i:=1 to n do 9 begin 10 read(s[i]); 11 end; 12 for i:=1 to n do 13 for j:=1 to m do 14 begin 15 if i>=j then 16 f[i,0]:=max(f[i-1,0],f[i,0]); 17 f[i,j]:=f[i-1,j-1]+s[i]; 18 f[i+j,0]:=max(f[i+j,0],f[i,j]); 19 end; 20 write(f[n,0]); 21 end.