[bzoj1613 Usaco2007 Jan]Running贝茜的晨练计划
题意
n分钟跑步,每分钟可以跑步或休息
疲惫值的上限为m
若跑步,第i分钟可以跑Di米,增加一单位疲惫值
若休息,恢复一单位疲惫值,但必须恢复到疲惫值为0才能继续跑步
跑步结束时疲惫值必须为0
求最远可以跑的距离
分析
dp
f[i][j]表示第i分钟,疲惫值为j的最远距离
f[i][j]=f[i-1][j-1]+Di
f[i][0]=max(f[i-1][0],f[i-j][j])//休息到第i秒刚好疲惫值为0,或疲惫值已经为0而接着休息
注意需要考虑清楚所有情况
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 using namespace std;
5
6 int f[10010][505];
7 int d[10010];
8 int main(){
9 //freopen("input.in","r",stdin);
10 //freopen("output.out","w",stdout);
11 int n,m;
12 scanf("%d%d",&n,&m);
13 for (int i=1;i<=n;i++)
14 scanf("%d",&d[i]);
15
16 memset(f,0,sizeof(f));
17
18 for (int i=1;i<=n;i++)
19 for (int j=0;j<=m;j++){
20 if (j>0) f[i][j]=max(f[i][j],f[i-1][j-1]+d[i]);
21 if(i-j>0) f[i][0]=max(f[i][0],f[i-j][j]);
22 f[i][0]=max(f[i][0],f[i-1][0]);
23 }
24
25 printf("%d",f[n][0]);
26 return 0;
27 }