USACO 奶牛的锻炼
2012-09-27 12:52
381 查看
奶牛的锻炼
背景 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
5 2
5
3
4
2
10
样例输出 Sample Output
9
时间限制 Time Limitation
1s
注释 Hint
N <= 2000 , M <= 500 , D_i <= 1000
是一题DP
分析:
用 f[i,j,k]来记录
i表示时间,
j表示疲劳度
k表示跑步还是休息的状态,跑步用1,休息用0
状态的转换
跑步<-休息
f[i,1,1]=MAX{ f[i,1,1],f[i-1,0,0]}
跑步<-跑步
f[i,j,1]=MAX{ f[i,j,1],f[i-1,j-1,1]}
休息<-休息
f[i,j,0]=MAX{f[i,j,0],f[i-1,j+1,0],f[i-1,0,0]}
休息<-跑步
f[i,j,0]=MAX{f[i,j,0],f[i-1,j+1,1]};
那么代码也就简单了,只要注意一下边界的条件。
var
n,m,i,j:longint;
a:array[1..2000] of longint;
f:array[0..2000,-1..501,0..1] of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
begin
readln(n,m);
for i:=1 to n do read(a[i]);
for i:=1 to n do begin
f[i,1,1]:=f[i-1,0,0]+a[i];
for j:=1 to m do
f[i,j,1]:=max(f[i,j,1],f[i-1,j-1,1]+a[i]);
for j:=0 to m do
f[i,j,0]:=max(f[i-1,j+1,1],max(f[i-1,j+1,0],f[i-1,0,0]));
end;
writeln(f[n,0,0]);
end.
背景 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
5 2
5
3
4
2
10
样例输出 Sample Output
9
时间限制 Time Limitation
1s
注释 Hint
N <= 2000 , M <= 500 , D_i <= 1000
是一题DP
分析:
用 f[i,j,k]来记录
i表示时间,
j表示疲劳度
k表示跑步还是休息的状态,跑步用1,休息用0
状态的转换
跑步<-休息
f[i,1,1]=MAX{ f[i,1,1],f[i-1,0,0]}
跑步<-跑步
f[i,j,1]=MAX{ f[i,j,1],f[i-1,j-1,1]}
休息<-休息
f[i,j,0]=MAX{f[i,j,0],f[i-1,j+1,0],f[i-1,0,0]}
休息<-跑步
f[i,j,0]=MAX{f[i,j,0],f[i-1,j+1,1]};
那么代码也就简单了,只要注意一下边界的条件。
var
n,m,i,j:longint;
a:array[1..2000] of longint;
f:array[0..2000,-1..501,0..1] of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
begin
readln(n,m);
for i:=1 to n do read(a[i]);
for i:=1 to n do begin
f[i,1,1]:=f[i-1,0,0]+a[i];
for j:=1 to m do
f[i,j,1]:=max(f[i,j,1],f[i-1,j-1,1]+a[i]);
for j:=0 to m do
f[i,j,0]:=max(f[i-1,j+1,1],max(f[i-1,j+1,0],f[i-1,0,0]));
end;
writeln(f[n,0,0]);
end.
相关文章推荐
- BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP
- USACO 5.1.1 Fencing the Cows 圈奶牛 题解与分析
- 【备战蓝桥杯】USACO--> calfflac 奶牛回文
- USACO 2004 OPEN Moofest 奶牛集会
- usaco顺序的分数(随便搞,排序可以)和健康的赫斯坦奶牛(dfs)(水)
- 【bzoj 1604】: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 set+并查集
- 【BZOJ1638】[Usaco2007 Mar]Cow Traffic 奶牛交通【DAG】【拓扑排序】【DP】
- bzoj 1231 [Usaco2008 Nov]mixup2 混乱的奶牛
- BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛
- 奶牛的锻炼-线性dp
- 奶牛的锻炼...dp
- BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿距离转切比雪夫距离 Treap
- bzoj1616[Usaco2008 Mar]Cow Travelling游荡的奶牛
- BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛
- BZOJ1616[Usaco2008 Mar]Cow Travelling游荡的奶牛 dp
- bzoj1690 [Usaco2007 Dec]奶牛的旅行
- bzoj1623 [Usaco2008 Open]Cow Cars 奶牛飞车
- bzoj1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛
- bzoj1669 [Usaco2006 Oct]Hungry Cows饥饿的奶牛
- BZOJ 1690: [Usaco2007 Dec]奶牛的旅行