题目大意:
N分钟,奶牛每分钟可以选择是停下休息还是往前走,如果选择往前走的话可以在第i分钟走Di,当然,疲劳值也会增加1。如果选择休息则疲劳值会每分钟减小1,当奶牛停下来以后,只能在疲劳值降到0时才能继续再走。已知奶牛的疲劳值最多不能超过M,当小刚度过N分钟后要保证他的疲劳值为0,问小刚最多能走多长的距离。
基本思路:
先设dp[i][j]表示小明在i分钟,疲劳值为j时所能走的最远距离。
a)、先看dp[i][0]的情况,表示第i分钟时,疲劳值为0,考虑这个值由哪些情况得到,1、dp[i][0] = dp[i-1][0],这个没有任何问题。2、dp[i][0] = dp[i-j][j]。表示i-j分钟时的疲劳值为j,然后一直休息j分钟把疲劳值降成0。
b)、现在考虑dp[i][j]的情况,它可以由dp[i-1][j-1] + Di得到,表示第i分钟选择走Di。因为要保证没有后效性,所以只有这一种情况可以转移。
代码如下:#include<iostream>
#include<cstring>
using namespace std;
int dp[10005][505];//dp[i][j]表示第i分钟疲劳度为j走的最大距离
int a[10005];
int main()
{
int i,j;
int n,m;
while(cin>>n>>m)
{
for(i=1; i<=n; i++)
cin>>a[i];
for(i=1; i<=n; i++)//遍历分钟
{
for(j=1; j<=m&&j<=i; j++)//遍历疲劳值
dp[i][j]=dp[i-1][j-1]+a[i];//
dp[i][0]=dp[i-1][0];//第i分钟需要休息
for(j=1; j<=m&&i-j>=j; j++)//i-j>=j表示下面dp[i-j][j]中的时间比疲劳大
dp[i][0]=max(dp[i-j][j],dp[i][0]);
}
cout<<dp[n][0]<<endl;
}
return 0;
}
651

被折叠的 条评论
为什么被折叠?



