題目:1043. 分隔數組以得到最大和
給出整數數組 A,將該數組分隔爲長度最多爲 K 的幾個(連續)子數組。分隔完成後,每個子數組的中的值都會變爲該子數組中的最大值。
返回給定數組完成分隔後的最大和。
示例:
輸入:A = [1,15,7,9,2,5,10], K = 3
輸出:84
解釋:A 變爲 [15,15,15,9,10,10,10]
提示:
- 1 <= K <= A.length <= 500
- 0 <= A[i] <= 10^6
來源:力扣(LeetCode)
鏈接:添加鏈接描述
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
基本思想:動態規劃
- dp[i] : 前 i 個元素包括第 i 個元素 分隔後的最大和
- 狀態:數組中的每一個元素
- 選擇:考慮當前元素的情況下,其包含該元素的左面連續K個元素如何分隔
- 狀態轉移方程:針對當前元素左面的連續K個元素,考慮每一種可能的分隔情況的最大值。
說明:代碼中內層循環從後往前遍歷,便於找最大值
class Solution {
public:
int maxSumAfterPartitioning(vector<int>& A, int K) {
vector<int> dp(A);
for(int i = 0; i < A.size(); ++i){
int cur_m = A[i];
for(int j = i; j > i - K && j >= 0; --j){
cur_m = max(cur_m, A[j]);
dp[i] = max(dp[i], (j > 0 ? dp[j - 1] : 0) + cur_m * (i - j + 1));
}
}
return dp[A.size() - 1];
}
};