分治法求最大子段和

来源:互联网 发布:网站刷流量软件 编辑:程序博客网 时间:2024/04/30 00:30
#include<iostream>using namespace std;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 main(){    int n,a[100],m,maxsum;    cout<<"请输入整数序列的元素个数n:"<<endl;    cin>>n;    cout<<"请输入序列中各元素的值a[i](一共"<<n<<"个)"<<endl;    for(m=0;m<n;m++)        cin>>a[m];    int b[100];    for(m=0;m<n;m++)        b[m+1]=a[m];    maxsum=MaxSubSum(b,1,n);    cout<<"整数序列的最大子段和是:"<<maxsum<<endl;    system("pause");}