public class Solution {
/**
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
public int maxTwoSubArrays(ArrayList<Integer> nums) {
// 2015-3-12 DP O(n)
if (nums == null || nums.size() == 0) {
return 0;
}
// left[i] 表示 0到i right[i] 表示 i到n - 1
int[] left = new int[nums.size()];
int[] right = new int[nums.size()];
// DP from left to right
int sum = 0;
int minSum = 0;
int max = Integer.MIN_VALUE;
for (int i = 0; i < nums.size(); i++) {
sum += nums.get(i);
max = Math.max(sum - minSum, max);
minSum = Math.min(sum, minSum);
left[i] = max;
}
// DP form right to left
sum = 0;
minSum = 0;
max = Integer.MIN_VALUE;
for (int i = nums.size() - 1; i >= 0; i--) {
sum += nums.get(i);
max = Math.max(max, sum - minSum);
minSum = Math.min(sum, minSum);
right[i] = max;
}
int result = Integer.MIN_VALUE;
for (int i = 1; i < nums.size(); i++) {
result = Math.max(left[i - 1] + right[i], result);
}
return result;
}
}