算法流程:
①将数组x[1...n]分为x[1...n/2]和x[n/2+1...n]
②递归求解子问题
S1:数组x[1...n/2]的最大子数组。
S2:数组x[n/2+1...n]的最大子数组。
③合并子问题,得到Smax
S3: 跨中点的最大子数组。
Smax=max{S1,S2,S3}
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n;
int CrossingSubArray(int a[],int low,int mid,int high)
{
int sleft=-100,sright=-100,sum1=0,sum2=0;
for(int i=mid;i>=0;i--)
{
sum1=sum1+a[i];
if(sum1>=sleft)
{
sleft=sum1;
}
}
for(int j=mid+1;j<n;j++)
{
sum2=sum2+a[j];
if(sum2>=sright)
{
sright=sum2;
}
}
int s3=sleft+sright;
return s3;
}
int MaxSubArray(int a[],int low,int high)
{
int smax;
if(low==high)return a[low];
else
{
int mid=(low+high)/2;
int s1=MaxSubArray(a,low,mid);
int s2=MaxSubArray(a,mid+1,high);
int s3=CrossingSubArray(a,low,mid,high);
smax=s1;
if(s2>smax)
{
smax=s2;
}
if(s3>smax)
{
smax=s3;
}
}
return smax;
}
int main()
{
int a[100];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cout<<MaxSubArray(a,0,n-1)<<endl;
return 0;
}