#include
int max3(int a, int b, int c)
{
if (a
a = b;
if (a
return c;
else
return a;
}
int maxSubSum (int a[], int left, int right)
{
if (left == right)
return a[left];
int i, mid;
int maxLeftSum, maxRightSum;
int maxMidSum1, maxMidSum2, sumer1, sumer2;
// 求左、右子表最大子序列
mid = (left + right) / 2;
maxLeftSum = maxSubSum(a, left, mid);
maxRightSum = maxSubSum(a, mid+1, right);
// 求跨左右子表的最大子序列
for (i = mid; i >= left; --i) {
if (i == mid) {
maxMidSum1 = sumer1 = a[i];
} else {
sumer1 += a[i];
if (maxMidSum1
maxMidSum1 = sumer1;
}
}
for (i = mid+1; i <= right; ++i) {
if (i == mid+1) {
maxMidSum2 = sumer2 = a[i];
} else {
sumer2 += a[i];
if (maxMidSum2
maxMidSum2 = sumer2;
}
}
return max3(maxLeftSum, maxRightSum, maxMidSum1+maxMidSum2);
}
int main ()
{
int a[100];
int n = 0;
while (scanf("%d", &a[n++]) != EOF) ;
printf("%d", maxSubSum(a, 0, n-2));
return 0;
} 算法分析: