博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode 最大子数组III
阅读量:6457 次
发布时间:2019-06-23

本文共 1564 字,大约阅读时间需要 5 分钟。

v题目描述

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

  返回最大的和。

v注意事项

  子数组最少包含一个数

v样例

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

v思路

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

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

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

v代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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;
    
}
 
}
本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/7376237.html,如需转载请自行联系原作者
你可能感兴趣的文章
python全栈_002_Python3基础语法
查看>>
C#_delegate - 调用列表
查看>>
交换机二层接口access、trunk、hybird三种模式对VLAN的处理过程
查看>>
jQuery.extend 函数详解
查看>>
[转]Windows的批处理脚本
查看>>
lnmp高人笔记
查看>>
[转载] OpenCV2.4.3 CheatSheet学习(三)
查看>>
C#中跨窗体操作(2)--消息机制
查看>>
子程序框架
查看>>
多维数组元素的地址
查看>>
maven的错误记录
查看>>
数据库运维体系_SZMSD
查看>>
aspose 模板输出
查看>>
福大软工1816 · 第三次作业 - 结对项目1
查看>>
selenium多个窗口切换
查看>>
《单页面应用》所获知识点
查看>>
静态库 调试版本 和发布版本
查看>>
DB2 错误码解析
查看>>
读书笔记四
查看>>
JAVA中的finalize()方法
查看>>