import
java.io.*;
public
class
GFG
{
static
int
maxSubArraySum(
int
a[],
int
size)
{
int
max_so_far = Integer.MIN_VALUE,
max_ending_here =
0
;
for
(
int
i =
0
; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if
(max_so_far < max_ending_here)
max_so_far = max_ending_here;
if
(max_ending_here <
0
)
max_ending_here =
0
;
}
return
max_so_far;
}
static
int
maximizeSum(
int
a[],
int
n)
{
int
cnt =
0
;
int
mini = Integer.MAX_VALUE;
int
minSubarray = Integer.MAX_VALUE;
int
sum = maxSubArraySum(a, n);
int
max_so_far = Integer.MIN_VALUE,
max_ending_here =
0
;
for
(
int
i =
0
; i < n; i++)
{
max_ending_here = max_ending_here + a[i];
cnt++;
minSubarray = Math.min(a[i], minSubarray);
if
(sum == max_ending_here)
{
if
(cnt ==
1
)
mini = Math.min(mini,
0
);
else
mini = Math.min(mini, minSubarray);
}
if
(max_ending_here <
0
)
{
max_ending_here =
0
;
cnt =
0
;
minSubarray = Integer.MAX_VALUE;
}
}
return
sum - mini;
}
public
static
void
main(String[] args)
{
int
a[] = {
1
,
2
,
3
, -
2
,
3
};
int
n = a.length;
System.out.println(maximizeSum(a, n));
}
}