簡體   English   中英

最大子數組iii(來自lintcode)動態編程解決方案

[英]maximum subarray iii (from lintcode) dynamic programming solution

誰能指導我完成下面的解決方案? p是什么意思? 為什么范圍j-1到i? 感謝給定一個整數數組和一個數字k,找到具有最大和的k個非重疊子數組。

每個子數組中的數字應該是連續的。

返回最大和。

根據此博客( http://www.cnblogs.com/lishiblog/p/4183917.html),DP分析是

DP。 d [i] [j]表示我們可以通過從前i個元素中選擇j個子數組來獲得最大和。

d [i] [j] = max {d [p] [j-1] + maxSubArray(p + 1,i)}

我們將p從i-1迭代到j-1,因此我們可以記錄在當前p處獲得的max子數組,當p變為p-1時,該值可用於計算從p-1到i的max子數組。

public class Solution {
/**
 * @param nums: A list of integers
 * @param k: An integer denote to find k non-overlapping subarrays
 * @return: An integer denote the sum of max k non-overlapping subarrays
 */
public int maxSubArray(ArrayList<Integer> nums, int k) {
    if (nums.size()<k) return 0;
    int len = nums.size();
    //d[i][j]: select j subarrays from the first i elements, the max sum we can get.
    int[][] d = new int[len+1][k+1];
    for (int i=0;i<=len;i++) d[i][0] = 0;        

    for (int j=1;j<=k;j++)
        for (int i=j;i<=len;i++){
            d[i][j] = Integer.MIN_VALUE;
            //Initial value of endMax and max should be taken care very very carefully.
            int endMax = 0;
            int max = Integer.MIN_VALUE;                
            for (int p=i-1;p>=j-1;p--){
                endMax = Math.max(nums.get(p), endMax+nums.get(p));
                max = Math.max(endMax,max);
                if (d[i][j]<d[p][j-1]+max)
                    d[i][j] = d[p][j-1]+max;                    
            }
        }

    return d[len][k];


}

}

p是什么意思:只是一個迭代器。 (中文算法編碼器始終喜歡變量的簡稱...)

為什么范圍j-1到i:

確實,dp分析應為:

d [i] [j] = max {d [p] [j-1] + maxSubArray(p + 1,i)} j-1 <= p <= i-1

為什么p> = j-1 因為作為dp [i] [j]定義:

d [i] [j]表示我們可以通過從前i個元素中選擇j個子數組來獲得最大和。

要知道,如果沒有j-1個元素的不重疊 ,我們就不能選擇j個子數組。 也就是說,當i> = j時,dp [i] [j]是有意義的。

如有任何疑問,請在此處發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM