DP題目總結
題意:
- 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;
}
};