原題連結
這道題讓我對狀態轉移的理解更深
題解
1.對於任意一個點,不是在休息就是在鍛鍊,因此可以設 \(dp[i][j]\) 又因為疲勞值對答案也會有影響,或者說,當確定時間,決策,疲勞值時,所走過的路的最大值是可以確定的
所以再加一維
code
#include<bits/stdc++.h>
using namespace std;
int dp[10005][2][505]={0};
int d[10005];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>d[i];
dp[0][0][0]=0;//第i分鐘,是否選擇休息,0代表休息,1代表運動,採取行動後的疲勞值,
for(int i=1;i<=n;i++)
{
dp[i][0][0]=max(max(dp[i-1][0][1],dp[i-1][1][1]),dp[i-1][0][0]);//疲勞值為0的休息,前一刻可能也在休息
for(int j=1;j<=m;j++)
{
dp[i][0][j]=max(dp[i-1][0][j+1],dp[i-1][1][j+1]);//前一刻要麼在運動,要麼在休息,可以隨時休息
if(j>1)dp[i][1][j]=dp[i-1][1][j-1]+d[i];//只能連續運動
else dp[i][1][1]=dp[i-1][0][0]+d[i];//如果運動後疲勞值為1,代表之前在休息
}
}
cout<<dp[n][0][0];//n時刻肯定在休息,疲勞值為0
return 0;
}