#include <stdio.h>
int
kadaneMinSubArr(
int
* nums,
int
l,
int
r);
int
kadaneMaxSubArr(
int
* nums,
int
l,
int
r);
int
max(
int
num1,
int
num2)
{
return
(num1 > num2) ? num1 : num2;
}
int
min(
int
num1,
int
num2)
{
return
(num1 > num2) ? num2 : num1;
}
void
maxSubArrSum(
int
* nums,
int
n)
{
int
l = -1, r = -1, sum = 0, minSubSum;
for
(
int
i = 0; i < n; i++) {
if
(nums[i] >= 0) {
l = i;
break
;
}
}
for
(
int
i = n - 1; i >= 0; i--) {
if
(nums[i] >= 0) {
r = i;
break
;
}
}
if
(l == -1 && r == -1) {
printf
(
"%d"
, kadaneMaxSubArr(nums, 0, n - 1));
return
;
}
for
(
int
i = l; i <= r; i++)
sum += nums[i];
minSubSum = kadaneMinSubArr(nums, l, r);
(minSubSum < 0) ?
printf
(
"%d"
, sum - minSubSum)
:
printf
(
"%d"
, sum);
}
int
kadaneMaxSubArr(
int
* nums,
int
l,
int
r)
{
int
sum = nums[l], maxSum = nums[l];
for
(
int
i = l; i <= r; i++) {
sum = max(sum + nums[i], nums[i]);
maxSum = max(maxSum, sum);
}
return
maxSum;
}
int
kadaneMinSubArr(
int
* nums,
int
l,
int
r)
{
int
sum = nums[l], minSum = nums[l];
for
(
int
i = l; i <= r; i++) {
sum = min(sum + nums[i], nums[i]);
minSum = min(minSum, sum);
}
return
minSum;
}
int
main()
{
int
arr[] = { 7, 6, -1, -4, -5, 7, 1 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
maxSubArrSum(arr, n);
return
0;
}