博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TYVJ P1023奶牛的锻炼(动态规划)

Posted on 2010-11-05 16:14  深处的心扉  阅读(1048)  评论(0)    收藏  举报
背景 Background
  USACO







描述 Description
  奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息。若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0)。若她在第i分钟休息,则疲倦程度减少1。无论何时,疲倦程度都不能超过M。另外,一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步。在第N分钟后,她的疲倦程度必须为0。







输入格式 Input Format
  第一行,两个整数,代表N和M。
接下来N行,每行一个整数,代表D_i。







输出格式 Output Format
  Bessie想知道,她最多能跑的距离。







样例输入 Sample Input
 







样例输出 Sample Output
 







时间限制 Time Limitation
  1s







注释 Hint
  N <= 2000 , M <= 500 , D_i <= 1000







来源 Source
  Vivian Snow
广东汕头聿怀初级中学NOIp第一次训练用题

 

分析:从题目中不难找出用f[i,j]来表示第i分钟耗费J疲劳值所得到的最大跑步距离,但是,接下来就不太好办了,所以本菜鸟借用了“cannot”大牛(ORZ)的思想,通过分析可以得到本题的阶段及分类情况:

 可有:f[i,j]=max(f[i,j],f[i-1,j-1]+a[i])   (j<>0)表示牛一直在奔跑的情况

           f[i,0]=max(f[i-1,0],f[i-j,j])表示从i-j分钟一直休息,回复体力值即减小疲劳值到0,并且本分钟也不跑

代码:

1 program p1023;
2 var a:array[0..2001]of longint;
3 f:array[0..2001,0..501]of longint; //一开始范围开小了,导致两个点没过,好囧…………
4 n,m:longint;
5
6 procedure init;
7 var i:longint;
8 begin
9 assign(input,'input.txt');
10 reset(input);
11 assign(output,'output.txt');
12 rewrite(output);
13 readln(n,m);
14 for i:=1 to n do
15 read(a[i]);
16 close(input);
17 end;
18
19 function max(a,b:longint):longint;
20 begin
21 if a>b then exit(a)
22 else
23 exit(b);
24 end;
25
26 procedure work;
27 var i,j,k:longint;
28 begin
29 fillchar(f,sizeof(f),200);
30 f[0,0]:=0;
31 for i:=1 to n do
32 begin
33 for j:=0 to m do
34 begin
35 if j<>0 then //一直跑的状态
36 f[i,j]:=max(f[i,j],f[i-1,j-1]+a[i]);
37 if i>=j then //休息的状态
38 f[i,0]:=max(f[i,0],f[i-j,j]);
39 f[i,0]:=max(f[i,0],f[i-1,0]);
40 end;
41 end;
42 writeln(f[n,0]);
43 end;
44
45 begin
46 init;
47 work;
48 close(output);
49 end.