您的位置:首页 > 其它

计蒜客 难题题库 222 疲倦程度

2015-08-11 09:17 120 查看
27次
3.70%
1000ms
65536K

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

输入格式:
第一行,两个整数,代表N和M。 接下来N行,每行一个整数,代表D_i。
输出格式:
Bessie想知道,她最多能跑的距离。
N < = 2000 , M < = 500 , D_i < = 1000

样例1

输入:
5 2
5
3
4
2
10


输出:
9


/* 下面的程序不满足 一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步
#include<iostream>
using namespace std;

const int maxn = 2002;
const int maxm = 502;
int d[maxn];
int dp[maxn][maxm];     // dp[i][j] 表示前 i 分钟结束,疲劳程度为 j 能跑的最远距离

int main(){
int n, m;
cin >> n >> m;
int i, j;
for(i = 1; i <= n; ++i){
cin >> d[i];
}
for(i = 1; i <= n; ++i){
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
for(j = 1; j < m; ++j){
dp[i][j] = max(d[i] + dp[i - 1][j - 1], dp[i - 1][j + 1]);
}
dp[i][m] = d[i] + dp[i - 1][j - 1];
}
cout << dp
[0] << endl;
}
*/

#include<iostream>
using namespace std;

const int maxn = 10010;     // 骗子,说好的 N <= 2000的呢?
const int maxm = 510;
int d[maxn];
int dp[maxn][maxm][2];
// dp[i][j][0] 表示第 i 分钟不跑的话,前 i 分钟结束,疲劳程度为 j 能跑的最远距离
// dp[i][j][1] 表示第 i 分钟跑的话,前 i 分钟结束,疲劳程度为 j 能跑的最远距离

int main(){
int n, m;
cin >> n >> m;
n = min(n, maxn - 1);
m = min(m, maxm - 1);
int i, j;
for(i = 1; i <= n; ++i){
cin >> d[i];
}
for(i = 1; i <= n; ++i){
// 不跑
// 第 i 分钟不跑,结束时疲惫程度为 0
dp[i][0][0] = max(max(dp[i - 1][0][0], dp[i - 1][1][0]),
max(dp[i - 1][0][1], dp[i - 1][1][1]) );
// 第 i 分钟不跑,结束时疲惫程度为 j
for(j = 1; j < m; ++j){
dp[i][j][0] = max(dp[i - 1][j + 1][0], dp[i - 1][j + 1][1]);
}
// 第 i 分钟不跑,结束时疲惫程度为 m,不可能
dp[i][m][0] = 0;

// 跑
// 第 i 分钟跑,结束时疲惫程度为 0,不可能
dp[i][0][1] = 0;
// 第 i 分钟跑,结束时疲惫程度为 1,前一分钟只能没跑,且疲劳程度为 0
dp[i][1][1] = d[i] + dp[i - 1][0][0];
// 第 i 分钟跑,结束时疲惫程度为 j,j >= 2, j - 1 >= 1,所以第 i - 1 分钟只能跑
for(j = 2; j <= m; ++j){
dp[i][j][1] = d[i] + dp[i - 1][j - 1][1];
}
}
cout << dp
[0][0] << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: