P1353 [USACO08JAN] Running S

纯粹的發表於2024-03-28

原題連結

這道題讓我對狀態轉移的理解更深

題解

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;
}

一遍過好開心

相關文章