tyvj p1023(奶牛的锻炼)(100)

看起来不是很难,一道动规题(话说最近一直在刷动规题啊)

一开始只想到两个动规方程:

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.
posted @ 2012-12-02 11:42  改名字干什么  阅读(167)  评论(0编辑  收藏  举报