/*问题的提出:
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为
Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为20*/
#include<stdio.h>
#define MAX 100
int maxsub(int left,int right);
int a[MAX];
int main()
{
int i;
int count;
scanf("%d",&count);
for(i=0;i<count;i++)
{
scanf("%d",&a[i]);
}
printf("%d\n",maxsub(0,count-1));
return 0;
}
int maxsub(int left,int right)
{
int center,i;
int sum,left_sum,right_sum;
int left_max,right_max;
center=(left+right)/2;
if(left==right)
return a[left];
else
{
left_sum=maxsub(left,center);
right_sum=maxsub(center+1,right);
sum=0;
left_max=0;
for(i=center;i>=left;i--)
{
sum+=a[i];
if(sum>left_max)
left_max=sum;
}
sum=0;
right_max=0;
for(i=center+1;i<=right;i++)
{
sum+=a[i];
if(sum>right_max)
right_max=sum;
}
sum=right_max+left_max;
if(sum<left_sum)
sum=left_sum;
if(sum<right_sum)
sum=right_sum;
}
return sum;
}