pku3661 Running
生活随笔
收集整理的這篇文章主要介紹了
pku3661 Running
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
USACO月賽的銀組題,dp性質比較明顯,實現時有細節要注意
用f[i,j]表示第i分鐘跑,疲勞度為j時的最遠距離
? g[i,j]表示第i分鐘休息,疲勞度為j時的最遠距離
有f[i,j]=max{f[i-1,j-1]+d[i]?? i>1 //上一秒跑
?????????????????? g[i-1,0]+d[i]??? j=1 //上一秒剛休息到疲勞為零}
? g[i,j]=max{g[i-1,j+1]? j<m //上一秒休息
?????????????????? f[i-1,j+1]? j<m //上一秒跑
?????????????????? g[i-1,0]?? j=0? //注意這個情況,體力為零時仍可以再休息}
View Code 1 program pku3661(input,output);2 var
3 h : array[0..10001] of longint;
4 f,g : array[0..10001,-1..501] of longint;
5 n,m : longint;
6 procedure init;
7 var
8 i : longint;
9 begin
10 readln(n,m);
11 for i:=1 to n do
12 read(h[i]);
13 end; { init }
14 function max(aa,bb :longint ):longint;
15 begin
16 if aa>bb then
17 exit(aa);
18 exit(bb);
19 end; { max }
20 function min(aa,bb :longint ):longint;
21 begin
22 if aa<bb then
23 exit(aa);
24 exit(bb);
25 end; { min }
26 procedure main;
27 var
28 i,j : longint;
29 begin
30 fillchar(f,sizeof(f),0);
31 fillchar(g,sizeof(g),0);
32 for i:=1 to n do
33 for j:=0 to m do
34 begin
35 if j>1 then
36 f[i,j]:=max(f[i-1,j-1]+h[i],f[i,j]);
37 if j=1 then
38 f[i,j]:=max(f[i,j],g[i-1,0]+h[i]);
39 if j<=m-1 then
40 g[i,j]:=max(g[i-1,j+1],f[i-1,j+1]);
41 if j=0 then
42 g[i,j]:=max(g[i-1,0],g[i,j]);
43 end;
44 end; { main }
45 procedure print;
46 begin
47 writeln(g[n,0]);
48 end; { print }
49 begin
50 assign(input,'cowrun.in');reset(input);
51 assign(output,'cowrun.out');rewrite(output);
52 init;
53 main;
54 print;
55 close(input);
56 close(output);
57 end.
轉載于:https://www.cnblogs.com/neverforget/archive/2012/02/28/2371655.html
總結
以上是生活随笔為你收集整理的pku3661 Running的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中System重定向输出流
- 下一篇: 监控录像帮忙找回医院被偷的女婴