这道题让我对状态转移的理解更深
题解
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;
}