leetcode1043. 分隔數組以得到最大和/動態規劃

題目: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個元素,考慮每一種可能的分隔情況的最大值。dp[i]=max(dp[i],max(A[ji])(ij+1)+dp[j1]),iK<j<=ij>=0dp[i] = max(dp[i], max(A[j…i])*(i - j + 1) + dp[j - 1]), i - K < j <= i 並且 j >= 0

說明:代碼中內層循環從後往前遍歷,便於找最大值

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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章