//最大子段和问题的分治算法
int MaxSubSum(int *a,int left,int right)
{
int sum=0;
if (left==right) sum=a[left]>0?a[left]:0;
else
{
int center=(left+right)/2;
int leftsum=MaxSubSum(a,left,center);
int rightsum=MaxSubSum(a,center+1,right);
int s1=0;
int lefts=0;
for (int i=center;i>=left;--i)
{
lefts+=a[i];
if (lefts>s1)
{
s1=lefts;
}
}
int s2=0;
int rights=0;
for (int i=center+1;i<=right;++i)
{
rights+=a[i];
if (rights>s2)
{
s2=rights;
}
}
sum=s1+s2;
if (sum<leftsum)
{
sum=leftsum;
}
if (sum<rightsum)
{
sum=rightsum;
}
}
return sum;
}
int MaxSum1(int n,int *a)
{
return MaxSubSum(a,1,n);
}
//最大子段和的动态规划算法
int MaxSum2(int n,int *a)
{
int sum=0,b=0;
for (int i=1;i<=n;++i)
{
if (b>0)
{
b+=a[i];
}
else
{
b=a[i];
}
if (b>sum)
{
sum=b;
}
}
return sum;
}