明显的二维动态规划,具体看代码
Code:
#include<iostream>//头文件
#include<algorithm>
using namespace std;
int a[10005],dp[10005][505];//a数组为输入,dp是状态i=状态层数 j=疲劳度(走的话(加疲劳度)就-1,休息的话(减疲劳度)就+1(也就是反过来)
int main(){
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++){
cin>>a[i];//输入 scanf更快
}
for(int i=1; i<=n; i++){//枚举每一个时间段的跑步米数
for(int j=m; j>=0; j--){//倒推是因为j由j+1推来
if(i+j<=n){//第一个状态转移方程
dp[i+j][0]=max(dp[i+j][0],dp[i-1][j+1]);
//如果当前剩下的时间全休息都恢复不了0体力,直接拜拜,继承上一个状态(摆烂
}
//第二组状态转移方程组
if(j==0){
dp[i][j]=max(dp[i][j],dp[i-1][0]);
//如果一直休息才能使米数最多,就继承上一次的状态
}
else dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i]);
//若果走的米数最优,就将上一个状态dp[i-1][j]加上一疲劳度就变成dp[i-1][j-1],加上米数
}
}
cout<<dp[n][0];//输出第第n层的0疲劳度的米数最大值
//return 0;(好习惯但我不写(懒
}