当前位置: 首页 > 知识库问答 >
问题:

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

晁开宇
2023-03-14

有人能教我一下下面的解决方案吗?p是什么意思?为什么它的范围是j-1到I?感谢给定一个整数数组和一个数字k,找出k个不重叠的子数组,它们有最大的和。

每个子数组中的数字应该是连续的。

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个答案

巴博耘
2023-03-14

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

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

事实上,dp分析应:

有任何问题,请在此留言。

 类似资料:
  • 令我惊讶的是,它通过了所有的测试用例。有人能给我解释一下这个逻辑吗?

  • 免责声明:我知道这个问题可以通过数组的单次传递非常有效地解决,但我对用分而治之法做这个很感兴趣,因为它与我们用分而治之法处理的典型问题有点不同。 假设给定一个浮点数组x[1:n],大小为n,间隔长度为l。问题是设计一个分治算法,从具有最大和的数组中找到长度为l的子数组。 现在,为了将问题分成两半,我决定在n-l+1/2处中断数组,以便将相等数量的子数组分配到我的除法的两半,如下面的算法所示。同样,

  • 我试图在一个数组中找到具有最大和的邻接子数组。所以,对于数组 {5,15,-30,10,-5,40,10}

  • 很抱歉发了这么长的帖子,但我不明白我做错了什么。感谢您事先的帮助! 这里是当前面提到的列表作为输入给出时的输出,我已经经历并查看了每一个步骤,列表中的每一个消除在我看来都是合乎逻辑的,我不知道一个人怎么会以结束和105结束。如果有人能帮我理解,我会非常感激的!

  • 问题内容: 给你一个包含 1 到 n 的整数数组,但数组中从 1 到 n 的数字之一丢失了。您需要提供最佳解决方案来找到丢失的数字。数组中的数字不能重复。 例如: 问题答案: 用 初始化两个变量最大和最小 迭代数组 如果当前元素大于最大值,则将当前元素分配给最大值。 如果当前元素小于最小值,则将当前元素分配给最小值。 最后你会得到最小和最大的元素。 在数组中查找最小和最大元素的 Java 代码:

  • 给出了一个由N个整数组成的数组。 数组的最大和是该数组的非空连续子数组的元素的最大和。 例如,数组[1,-2,3,-2,5]的最大和是6,因为子数组[3,-2,5]的和是6,并且不可能实现更大的子数组和。 现在,您只能从给定数组中删除一个以上的元素。这样做可以得到的结果数组的最大可能最大和是多少? 我正在用我自己的测试用例测试我的代码。我在Dev-C++上得到了正确的输出。但是当我在网上测试我的代