lintcode 最大子数组III

简介: 题目描述   给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。   返回最大的和。 注意事项   子数组最少包含一个数 样例   给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8 思路   dp[i][j] = max(dp[x][j-1]+maxs[x+1][i])   dp[i][j] 表示前 i 个数中 j 个子数组的最大值,   maxs[i][j] 表示 第i个数到第j个数中最大子数组的和。

题目描述

  给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。

  返回最大的和。

注意事项

  子数组最少包含一个数

样例

  给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8

思路

  dp[i][j] = max(dp[x][j-1]+maxs[x+1][i])

  dp[i][j] 表示前 i 个数中 j 个子数组的最大值,

  maxs[i][j] 表示 第i个数到第j个数中最大子数组的和。

代码

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(int[] nums, int k) {
        // write your code here

        int[][] maxs = new int[nums.length][nums.length];
        int[][] dp = new int[nums.length][k+1];

        for(int i=0; i<nums.length; ++i) {
            for(int j=i; j<nums.length; ++j) {
                maxs[i][j] = maxSum(nums, i, j);
            }
        }
        
        for(int i=0; i<dp.length; ++i) {
            for(int j=0; j<dp[i].length; ++j) {
                dp[i][j] = Integer.MIN_VALUE;
            }
        }

        for(int i=0; i<dp.length; ++i) {
            dp[i][1] = maxs[0][i];
        }

        for(int i=1; i<nums.length; ++i) {
            for(int j=2; j<=k; ++j) {
                for(int x=j-2; x<i; ++x) {
                    dp[i][j] = Math.max(dp[i][j], dp[x][j-1] + maxs[x+1][i]);
                }
            }
        }
        return dp[nums.length-1][k];
    }

    private int maxSum(int[] nums, int i, int j) {
        int sum = 0, maxs = Integer.MIN_VALUE;
        for(int x = i; x <= j; ++x) {
            sum += nums[x];
            if (maxs < sum) {
                maxs = sum;
            }
            if (sum < 0) {
                sum = 0;
            }
        }
        return maxs;
    }

}

  

目录
相关文章
|
8天前
|
机器学习/深度学习
leetcode-52:N皇后 II
leetcode-52:N皇后 II
15 0
|
8天前
|
Java
leetcode-53:最大子序和
leetcode-53:最大子序和
22 0
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #52 N皇后 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #52 N皇后 II
lintcode 415 有效回文串
用String下的spilt(regex)去除除英文外的符号,regex是正则表达式,[]内写要删除的符号,但返回值是一个String型数组。
|
测试技术
最大子序和(LeetCode-53)
最大子序和(LeetCode-53)
65 0
最大子序和(LeetCode-53)
|
机器学习/深度学习 算法
LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩阵
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
98 0
LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩阵
53_最大子序和
53_最大子序和
82 0

热门文章

最新文章