问题描述:
给定由n个整数(可能有负数)组成的序列,求一段连续的子序列,要求该序列和最大,并求出最大值。
分析:
将该序列平分为两段(A1..An/2;An/2….An),最大字段段和有三种情况,1:为左边的最大子段和leftsum,2:为右边的最大字段和rightsum,3:由左边靠近中点的最大连续子段+右边靠近中点的最大连续子段midsum。所以最终结果为三者中的最大值(MAX(leftsum,rightsum,midsum))。
#include <iostream>
using namespace std;
int MaxSum(int a[],int left,int right);
int main()
{
int n,a[100];
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int sum = MaxSum(a,0,n-1);
cout<<sum<<endl;
return 0;
}
int MaxSum(int a[],int left,int right)
{
int sum=0,midsum=0,leftsum=0,rightsum=0;
int center,s1,s2,lefts,rights;
if(left == right)
sum = a[left];
else
{
center = (left+right)/2;
leftsum = MaxSum(a,left,center);
rightsum = MaxSum(a,center+1,right);
s1 = -9999,lefts = 0;
for(int j=center;j>=left;j--)
{
lefts+=a[j];
if(lefts>s1)
s1=lefts;
}
s2=-9999,rights=0;
for(int i=center+1;i<=right;i++)
{
rights+=a[i];
if(rights>s2)
s2=rights;
}
midsum=s1+s2;
if(midsum<leftsum)
sum=leftsum;
else
sum=midsum;
if(sum<rightsum)
sum=rightsum;
}
return sum;
}