#include<iostream.h>
int MaxSum(int a[],int left,int right)
{
int sum=0;
if (left==right)
{ //如果序列长度为1,直接求解
if (a[left]>0)
sum=a[left];
else
sum=0;
}
else{
int center=(left+right)/2;
int leftsum=MaxSum(a,left,center);
int rightsum=MaxSum(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 j=center+1;j<=right;j++)
{
rights+=a[j];
if(rights>s2)
s2=rights;
}
sum=s1+s2;
if(sum<leftsum)sum=leftsum; //合并,在sum、leftsum和rightsum中取较大者
if(sum<rightsum)sum=rightsum;
}
return sum;
}
void main()
{
int n,a[100],m,maxsum;
cout<<"请输入整数序列的元素个数n:"<<endl;
cin>>n;
cout<<"请输入各元素的值(一共"<<n<<"个):"<<endl;
for(m=1;m<=n;m++)
cin>>a[m];
maxsum=MaxSum(a,1,n);
cout<<"整数序列的最大子段和是:"<<maxsum<<endl;
}
int MaxSum(int a[],int left,int right)
{
int sum=0;
if (left==right)
{ //如果序列长度为1,直接求解
if (a[left]>0)
sum=a[left];
else
sum=0;
}
else{
int center=(left+right)/2;
int leftsum=MaxSum(a,left,center);
int rightsum=MaxSum(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 j=center+1;j<=right;j++)
{
rights+=a[j];
if(rights>s2)
s2=rights;
}
sum=s1+s2;
if(sum<leftsum)sum=leftsum; //合并,在sum、leftsum和rightsum中取较大者
if(sum<rightsum)sum=rightsum;
}
return sum;
}
void main()
{
int n,a[100],m,maxsum;
cout<<"请输入整数序列的元素个数n:"<<endl;
cin>>n;
cout<<"请输入各元素的值(一共"<<n<<"个):"<<endl;
for(m=1;m<=n;m++)
cin>>a[m];
maxsum=MaxSum(a,1,n);
cout<<"整数序列的最大子段和是:"<<maxsum<<endl;
}