您的位置:首页 > 其它

奶牛的锻炼

2010-06-17 22:44 239 查看
题目描述:

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

具体题目及评测:http://www.tyvj.cn/ 题目代号为 P1023

今天晚上没自修,想干点什么,时间不多,这种情况写动态规划似乎很合适。于是乎我就写了。

F[i][j]表示i分钟,j的疲劳程度所跑的最长距离。

因为奶牛一停下休息,就需要休息到体力恢复为0为止。所以F[i][0]和其他F[i][j]是不一样的

F[i][j] = F[i-1][j-1] + R[i] //就是一个递推的过程 因为不可能停下来休息

F[i][0]则可能是F[k][0](奶牛就是恢复了体力也不跑步)和F[i-k][k](刚恢复)

所以

F[i][0] = max{ F[i-k][k] , F[k][0] }

j <= i

0 <= k < j

F[0][j] = 0

代码:

#include <iostream>
using namespace std;
int _gDp[2001][501];
int main()
{
int n,m;
int run[2001];
cin >> n >> m;

for( int i = 1;i <= n;++i )
cin >> run[i];

//!!!!!!初始化_gDp[0][i]=0  因为是全局函数 就不在做了

for( int time = 1;time <= n;++time )
{
//_gDp[i][0]
int max = 0;
for( int k = 0;k < time;++k )
{
if( _gDp[k][0] > max )
max = _gDp[k][0];
if( _gDp[time-k][k] > max )
max = _gDp[time-k][k];
}
_gDp[time][0] = max;
for( int tired = 1;tired <= m;++tired )
_gDp[time][tired] = _gDp[time-1][tired-1] + run[time];
}

/*for( int i = 0;i <= m;++i )
{
for( int j = 0;j <= n;++j )
cout << _gDp[j][i] << ' ';
cout << endl;
}*/

cout << _gDp
[0] << endl;
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: