#include <iostream>
#include <cmath>
using namespace std;
//O(nlogN)
int partition(int *data, int beg, int end)
{
int mid = beg + (end-beg)/2;
if(beg > end)
return 0;
else if(beg == end)
return data[beg];
int lsum = 0, lsubsum = data[mid];
for(int i = mid; i >= beg; i--)
{
lsum += data[i];
lsubsum = max(lsubsum, lsum);
}
int rsum = 0, rsubsum = data[mid+1];
for(int i = mid+1; i <= end; i++)
{
rsum += data[i];
rsubsum = max(rsubsum, rsum);
}
int lmaxsum = partition(data, beg, mid);
int rmaxsum = partition(data, mid+1, end);
return max(max(lmaxsum, rmaxsum), lsubsum+rsubsum);
}
int main()
{
int data[] = { -2,11,-4,13,-5,-2 };
int maxsum = partition(data, 0, sizeof(data)/sizeof(int)-1);
cout << "maxsum: " << maxsum << endl;
//cout << "Hello world!" << endl;
return 0;
}
//O(n)
int maxSum(int *data, int beg, int end)
{
int tmpSum, maxSum;
tmpSum = maxSum = data[beg];
for(int i = beg+1; i <= end; i++)
{
tmpSum = max(tmpSum+data[i], data[i]);
maxSum = max(maxSum, tmpSum);
}
return maxSum;
}