Maximum Subarray III
public int maxSubArray(int[] nums, int k) {
if(nums ==null || nums.length == 0)
return 0;
int len = nums.length;
//以j结尾的数组里有i个子数组
//f[i][j] = Math.max(f[i][j], f[i-1][m]+ sumFromTo(i-1,j]);
int localMax, max;
int[][] f = new int[k+1][len+1];
int min = nums[0], sum = 0;
for(int i = 1; i <= k; i++){
for(int j = i; j <= len; j++){
localMax = 0; max = Integer.MIN_VALUE;
f[i][j] = Integer.MIN_VALUE;
for(int m = j-1; m >= i-1; m--){//i->j之间最大的subarray sum,需要从后往前算,这样求的是后端固定的maxSum
//从后往前,因为我们只需要从j-1到i-1内最大的,前面开始的话包括了i-1之前的值。和back-forward概念一样
//locaMax一定以当年Nums[m]结尾的sum,但是max不一定以当前结尾,而是截止到m为止最大,可有该nums[m]可无
localMax = Math.max(nums[m], localMax + nums[m]);
max = Math.max(localMax, max);
f[i][j] = Math.max(f[i][j], f[i-1][m]+ max);
}
}
}
return f[k][len];
}Last updated