/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
// your code goes here
int arr[] = {1,5,-3,4,-9,9,2};
int n = arr.length;
System.
out.
println("maximum sum of two non overlapping subarrays " + maxTwoOverLappingSubarrays
(arr,n
)); }
public static int maxTwoOverLappingSubarrays(int [] arr, int n){
int[] prefixMaxSum = calculateMaxPrefixSum(arr,n);
int[] suffixMaxSum = calculateMaxSuffixSum(arr,n);
int[] maxPrefixSum = new int[n];
maxPrefixSum[0] = prefixMaxSum[0];
for(int i=1;i<n;i++){
maxPrefixSum
[i
] = Math.
max(prefixMaxSum
[i
],maxPrefixSum
[i
-1]); }
int[] maxSuffixSum = new int[n];
maxSuffixSum[n-1] = arr[n-1];
for(int i=n-2;i>=0;i--){
maxSuffixSum
[i
] = Math.
max(suffixMaxSum
[i
],maxSuffixSum
[i
+1]); }
int max = 0;
for(int i=0;i<n-1;i++){
max
= Math.
max(max,maxPrefixSum
[i
]+maxSuffixSum
[i
+1]);
}
return max;
}
public static int[] calculateMaxPrefixSum(int []arr, int n){
int[] prefixMaxSum = new int[n];
prefixMaxSum[0] = arr[0];
int currentMax = arr[0];
for(int i=1;i<n;i++){
prefixMaxSum
[i
] = Math.
max(0,
Math.
max(arr
[i
],arr
[i
]+currentMax
)); currentMax = prefixMaxSum[i];
}
return prefixMaxSum;
}
public static int[] calculateMaxSuffixSum(int[] arr, int n){
int[] suffixMaxSum = new int[n];
suffixMaxSum[n-1] = arr[n-1];
int currentMax = arr[n-1];
for(int i=n-2;i>=0;i--){
suffixMaxSum
[i
] = Math.
max(0,
Math.
max(arr
[i
],arr
[i
]+currentMax
)); currentMax = suffixMaxSum[i];
}
return suffixMaxSum;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQlpbnQgYXJyW10gPSB7MSw1LC0zLDQsLTksOSwyfTsKCQlpbnQgbiA9IGFyci5sZW5ndGg7CgkJU3lzdGVtLm91dC5wcmludGxuKCJtYXhpbXVtIHN1bSBvZiB0d28gbm9uIG92ZXJsYXBwaW5nIHN1YmFycmF5cyAgIiArIG1heFR3b092ZXJMYXBwaW5nU3ViYXJyYXlzKGFycixuKSk7Cgl9CglwdWJsaWMgc3RhdGljIGludCBtYXhUd29PdmVyTGFwcGluZ1N1YmFycmF5cyhpbnQgW10gYXJyLCBpbnQgbil7CgkJaW50W10gcHJlZml4TWF4U3VtID0gY2FsY3VsYXRlTWF4UHJlZml4U3VtKGFycixuKTsKCQlpbnRbXSBzdWZmaXhNYXhTdW0gPSBjYWxjdWxhdGVNYXhTdWZmaXhTdW0oYXJyLG4pOwoJCQoJCWludFtdIG1heFByZWZpeFN1bSA9IG5ldyBpbnRbbl07CgkJbWF4UHJlZml4U3VtWzBdID0gcHJlZml4TWF4U3VtWzBdOwoJCWZvcihpbnQgaT0xO2k8bjtpKyspewoJCQltYXhQcmVmaXhTdW1baV0gPSBNYXRoLm1heChwcmVmaXhNYXhTdW1baV0sbWF4UHJlZml4U3VtW2ktMV0pOwoJCX0KCQkKCQlpbnRbXSBtYXhTdWZmaXhTdW0gPSBuZXcgaW50W25dOwoJCW1heFN1ZmZpeFN1bVtuLTFdID0gYXJyW24tMV07CgkJZm9yKGludCBpPW4tMjtpPj0wO2ktLSl7CgkJCW1heFN1ZmZpeFN1bVtpXSA9IE1hdGgubWF4KHN1ZmZpeE1heFN1bVtpXSxtYXhTdWZmaXhTdW1baSsxXSk7CgkJfQoJCWludCBtYXggPSAwOwoJCWZvcihpbnQgaT0wO2k8bi0xO2krKyl7CgkJCW1heCA9IE1hdGgubWF4KG1heCxtYXhQcmVmaXhTdW1baV0rbWF4U3VmZml4U3VtW2krMV0pOwoJCQkKCQl9CgkJcmV0dXJuIG1heDsKCQkKCX0KCXB1YmxpYyBzdGF0aWMgaW50W10gY2FsY3VsYXRlTWF4UHJlZml4U3VtKGludCBbXWFyciwgaW50IG4pewoJCWludFtdIHByZWZpeE1heFN1bSA9IG5ldyBpbnRbbl07CgkJcHJlZml4TWF4U3VtWzBdID0gYXJyWzBdOwoJCWludCBjdXJyZW50TWF4ID0gYXJyWzBdOwoJCWZvcihpbnQgaT0xO2k8bjtpKyspewoJCQlwcmVmaXhNYXhTdW1baV0gPSBNYXRoLm1heCgwLE1hdGgubWF4KGFycltpXSxhcnJbaV0rY3VycmVudE1heCkpOwoJCQljdXJyZW50TWF4ID0gcHJlZml4TWF4U3VtW2ldOwoJCX0KCQlyZXR1cm4gcHJlZml4TWF4U3VtOwoJfQoJcHVibGljIHN0YXRpYyBpbnRbXSBjYWxjdWxhdGVNYXhTdWZmaXhTdW0oaW50W10gYXJyLCBpbnQgbil7CgkJaW50W10gc3VmZml4TWF4U3VtID0gbmV3IGludFtuXTsKCQlzdWZmaXhNYXhTdW1bbi0xXSA9IGFycltuLTFdOwoJCWludCBjdXJyZW50TWF4ID0gYXJyW24tMV07CgkJZm9yKGludCBpPW4tMjtpPj0wO2ktLSl7CgkJCXN1ZmZpeE1heFN1bVtpXSA9IE1hdGgubWF4KDAsTWF0aC5tYXgoYXJyW2ldLGFycltpXStjdXJyZW50TWF4KSk7CgkJCWN1cnJlbnRNYXggPSBzdWZmaXhNYXhTdW1baV07CgkJfQoJCXJldHVybiBzdWZmaXhNYXhTdW07Cgl9CgkKfQ==