最大子阵列iii(来自lintcode)动态编程解决方案

时间:2015-03-12 17:55:04

标签: algorithm dynamic-programming arrays

有人可以通过以下解决方案告诉我吗? 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得到的最大子阵列,当p变为p-1时,该值可用于计算从p-1到i的最大子阵列

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];


}

}

1 个答案:

答案 0 :(得分:1)

p是什么意思:只是一个迭代器。 (中文算法编码器总是喜欢变量的简称......)

为什么它的范围是j-1到i:

确实,dp分析应该是:

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

为什么必须 p&gt; = j-1 ?因为dp [i] [j]定义:

d [i] [j]表示通过从前i个元素中选择j个子数组得到的最大总和。

您知道,我们无法从j-1元素中选择没有非重叠的j子阵列。也就是说,当i> = j时,dp [i] [j]才有意义。

有任何问题,请在这里发表评论。