题目描述
给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
样例1
输入:
List = [1,2,3]
k = 1
输出: 6
说明: 1 + 2 + 3 = 6
样例2
输入:
List = [-1,4,-2,3,-2,3]
k = 2
输出: 8
说明: 4 + (3 + -2 + 3) = 8
java题解
public class Solution {
public int maxSubArray(int[] nums, int k) {
if (nums.length < k) {
return 0;
}
int len = nums.length;
int[][] globalMax = new int[k + 1][len + 1];
int[][] localMax = new int[k + 1][len + 1];
for (int i = 1; i <= k; i++) {
localMax[i][i-1] = Integer.MIN_VALUE;
//小于 i 的数组不能够partition
for (int j = i; j <= len; j++) {
localMax[i][j] = Math.max(localMax[i][j-1], globalMax[i - 1][j-1]) + nums[j-1];
if (j == i)
globalMax[i][j] = localMax[i][j];
else
globalMax[i][j] = Math.max(globalMax[i][j-1], localMax[i][j]);
}
}
return globalMax[k][len];
}
}
C++题解
class Solution {
public:
int maxSubArray(vector<int> nums, int k) {
const int n = nums.size();
vector<vector<int> > f(k + 1, vector<int>(n + 1));
vector<vector<int> > p(k + 1, vector<int>(n + 1));
int sum;
for (int i = 1; i <= k; i++) {
sum = INT_MIN;
f[i][i] = f[i - 1][i - 1] + nums[i - 1];
p[i][i] = f[i][i];
sum = f[i][i];
for (int j = i + 1; j <= n; j++) {
if (f[i][j - 1] < p[i - 1][j - 1]) {
f[i][j] = p[i - 1][j - 1] + nums[j - 1];
}
else {
f[i][j] = f[i][j - 1] + nums[j - 1];
}
sum = max(sum, f[i][j]);
p[i][j] = sum;
}
}
int result = INT_MIN;
for (int i = k; i <= n; i++) {
result = max(result, f[k][i]);
}
return result;
}
};
python题解
class Solution:
def maxSubArray(self, nums, k):
oo = 2 ** 32
n = len(nums)
f = [[-oo] * (k + 1), [-oo] * (k + 1)]
g = [[-oo] * (k + 1), [-oo] * (k + 1)]
f[0][0] = 0
g[0][0] = 0
for i in range(1, n + 1):
f[i % 2][0] = 0
g[i % 2][0] = 0
for j in range(1, k + 1):
f[i % 2][j] = max(f[(i - 1) % 2][j] + nums[i - 1],
g[(i - 1) % 2][j - 1] + nums[i - 1])
g[i % 2][j] = max(g[(i - 1) % 2][j], f[i % 2][j])
return g[n % 2][k]