# DP 題目總結

DP題目總結


1、LC1388. 3n 塊披薩

題意:

  • 3n的環形數組,每次取一個數後就刪除前後相鄰的兩個數,問最後取得的總數最大是多少。

分析:

  • 相當於不能取相鄰數(打家劫舍問題),但這裏是環形的,所以要拆成一個去掉第一個數的數組,一個去掉最後一個數的數組。算兩次取最大值

代碼

class Solution {
public:
    int maxSizeSlices(vector<int>& slices) {
        int n = slices.size();
        int k = n / 3;
        int dp[n][2][k + 1];
        memset(dp, 0, sizeof(dp));
        int res = 0;

        // 去掉第一個數
        dp[1][1][1] = slices[1];
        for(int i = 2; i < n; ++ i) {
            for(int j = 1; j <= k; ++ j) {
                dp[i][0][j] = max(dp[i - 1][0][j], dp[i - 1][1][j]);
                dp[i][1][j] = dp[i - 1][0][j - 1] + slices[i];
            }
        }
        res = max(res, max(dp[n - 1][0][k], dp[n - 1][1][k]));
        
        //去掉最後一個數
        memset(dp, 0, sizeof(dp));
        dp[0][1][1] = slices[0];
        for(int i = 1; i < n - 1; ++ i) {
            for(int j = 1; j <= k; ++ j) {
                dp[i][0][j] = max(dp[i - 1][0][j], dp[i - 1][1][j]);
                dp[i][1][j] = dp[i - 1][0][j - 1] + slices[i];
            }
        }
        res = max(res, max(dp[n - 2][0][k], dp[n - 2][1][k]));
        return res;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章