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

}

  

目录
相关文章
lintcode 415 有效回文串
用String下的spilt(regex)去除除英文外的符号,regex是正则表达式,[]内写要删除的符号,但返回值是一个String型数组。
|
机器学习/深度学习 算法
LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩阵
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
137 0
LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩阵
|
机器学习/深度学习 存储 算法
LintCode 题解丨大厂面试题:N皇后问题
LintCode 题解丨大厂面试题:N皇后问题
LintCode 题解丨大厂面试题:N皇后问题
[LintCode] Two Sum 两数之和
Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the tw.
1360 0