求数列的最大子段和
给定n个元素的整数列(可能为负整数)a1,a2,…,an,求形如ai,ai+1,aj,i,j=1,2,…,n,i<=j的子段,使其和为最大。
#include <iostream>
using namespace std;
int n,num[100],cmax;
int fun(int left,int right){
int lmax,rmax;//左边,右边最大值
if(left=right){//1个数的情况
cmax=num[left];
return cmax;
}
int mid=(left+right)/2;
lmax=fun(left,mid);//左边最大值
rmax=fun(mid+1,right);//右边最大值
//两边相加才有最大值
int sum1=0,sum2=0,le=num[mid],ri=num[mid];
for(int i=mid;i>=left;i--){
sum1+=num[i];
if(sum1>le)
le=sum1;
}
for(int i=mid+1;i<=right;i++){
sum2+=num[i];
if(sum2>ri)
ri=sum2;
}
cmax=le+ri;
if(lmax>cmax)
cmax=lmax;
else if(rmax>cmax)
cmax=rmax;
return cmax;
}
int main()
{
cout<<"请输入数的个数"<<endl;
cin>>n;
for(int i=1;i<=n;i++)
cin>>num[i];
fun(1,n);
cout<<cmax<<endl;
return 0;
}