分治法求最大字段和

#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");
}
转载请私信博主征得同意,并注明出处:https://blog.csdn.net/qq_34793133/article/details/80582358

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80602038
今日推荐