lintcode---43. 最大子数组 III
2018-03-10 12:32
465 查看
描述
给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。返回最大的和。
注意事项
子数组最少包含一个数
样例
给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8
代码
分析:与Best Time to Buy and Sell Stock IV类似,两个数组分别记录包含当前值的本地最优解和全局最优解。local[i][j]代表从0到nums中第i个数字处,分成j个数组后,和的最大值,且必须包括第i个数字,这样可以排除第i个数组包含在前一个数组中的情况。global[i][j]代表从0到nums第i个数字处,分成j个数组后和的最大值。二维数组动态规划的状态转移方程为:
local[i][j] = Math.max(local[i - 1][j], global[i - 1][j - 1]) + nums[i - 1];
global[i][j] = Math.max(global[i - 1][j], local[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 if(k>nums.length){ return 0; } int[][] local=new int[nums.length+1][k+1]; int[][] global=new int[nums.length+1][k+1]; for(int i=1;i<=nums.length;i++){ local[i][0]=Integer.MIN_VALUE; for(int j=1;j<=k;j++){ if(j>i){ local[i][j]=Integer.MIN_VALUE; global[i][j]=Integer.MIN_VALUE; continue; } local[i][j]=Math.max(local[i-1][j],global[i-1][j-1])+nums[i-1]; if(i==j){ global[i][j]=local[i][j]; }else{ global[i][j]=Math.max(global[i-1][j],local[i][j]); } } } return global[nums.length][k]; } }
相关文章推荐
- LintCode-最大子数组 III
- LintCode 43 最大子数组 III
- lintcode 最大子数组III
- [Lintcode]Maximum Subarray III最大子数组 III
- LintCode【简单】41. 最大子数组 。代码及思路
- LintCode:最大子数组 II
- lintcode--45. 最大子数组差
- [置顶] lintcode(617)最大平均值子数组
- 最大子数组 III
- lintcode最大子数组
- python_lintcode_698数组中最大的差值_3. 统计数字_12. 带最小值操作的栈
- LintCode-41. 最大子数组
- python_lintcode_简单题 _44最小子数组_41最大子数组
- LintCode -- 最大子数组 III
- [Lintcode]Maximum Subarray II 最大子数组 II
- Lintcode 41.最大子数组
- LintCode 最大子数组(dp)
- [LintCode] Maximum Subarray 最大子数组
- Lintcode 最大子数组 II
- Lintcode:最大子数组