如果二十分,请尝试用一下三维DP
查看原帖
如果二十分,请尝试用一下三维DP
1101254
Louisdlee楼主2024/10/17 02:15

注意到题目中的一个很关键的条件:如果贝茜选择休息,那么她的疲劳度就会每分钟减少 1 ,但她必须休息到疲劳度恢复到 0 为止。在疲劳度为 0 时休息的话,疲劳度不会再变动。

于是,如果当前分钟选择跑步,那么上一分钟只能选择跑步,或者上一分钟的疲劳度恰好为0. 如果休息,要么上一分钟跑步,要么上一分钟休息,要么上一分钟疲劳度是0.

#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define int long long
#define endl '\n'
#define PII pair<int,int>
#define INF 1e18

int dp[10007][507][2]; // 0表示休息,1表示上一次没在休息
void slove () {
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        int d;
        cin >> d;
        for (int j = 0; j <= min(i, m); j ++) {
            //第i分钟选择休息,在上一分钟疲劳度是0的时候休息
            if (j == 0)
            dp[i][0][0] = max(dp[i - 1][0][0], dp[i][0][0]);
            //在上一分钟休息的时候休息
            dp[i][j][0] = max(dp[i - 1][j + 1][0], dp[i][j][0]);
            //在上一分钟运动的时候休息
            dp[i][j][0] = max(dp[i - 1][j + 1][1], dp[i][j][0]);

            //第i分钟选择跑步,在上一分钟跑仍在跑步的时候跑步
            if (j > 1)
            dp[i][j][1] = max(dp[i - 1][j - 1][1] + d, dp[i][j][1]);
            // 或者在上一分钟疲劳度为0的时候开始跑
            if (j == 1)
            dp[i][1][1] = max(dp[i - 1][0][0] + d, dp[i][1][1]);
        }
    }

    cout << dp[n][0][0] << endl;
}

signed main () {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    slove();
}

然后再考虑化成二维数组...

2024/10/17 02:15
加载中...