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个数中最大子数组的和。
代码
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; } }
原文地址:https://www.cnblogs.com/hujunzheng/p/7376237.html
相关推荐
-
I/O模型简述 Java基础
2019-3-22
-
【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏) Java基础
2019-5-9
-
[问题分析]Zuul网关找不到路由后报错ZuulException: Filter threw Exception Java基础
2019-9-7
-
App框架实现———dagger2 Java基础
2020-5-30
-
常用正则表达式 Java基础
2019-9-2
-
Java读取Properties文件 Java基础
2019-9-3
-
git如何只输入一次密码 Java基础
2019-8-23
-
基于Mybatis-plus多租户实现方案 Java基础
2020-6-14
-
java集合之HashMap源码解析 Java基础
2019-9-6
-
06.过期类、属性、接口的正确处理姿势 Java基础
2020-6-13