首尾相连数组的最大子数组和

来源:互联网 发布:开淘宝计划书怎么写 编辑:程序博客网 时间:2024/05/16 15:18

1.求0~N-1的最大子数组和 M_1

2.求跨越 N-1和0的最大子数组和,分别求从0开始的最大和M_21,从n-1开始的最大和M_22,分别记录得到最大和的位置pi,pj,这里分两种情况考虑

a.pi<pj,则M=max(M_1,M_21+M_22);

b. pi>=pj,则求0~N-1的最小子数组和M_3,及0~N-1的和Mx ,M=max(M_1,Mx-M_3);

 

#include <iostream>#include <vector>using namespace std;int solve(vector<int> vec){    int n=vec.size();    int sumtotal=0,i;    for(i=0;i<n;++i){        sumtotal+=vec[i];    }    // maxsum of subarray[1...N]    int maxsum=0,sum=0;;    for(i=0;i<n;++i){        if(sum+vec[i]<=0){            sum=0;        }else{            sum+=vec[i];        }        if(sum>maxsum){            maxsum=sum;        }    }    // minsum of subarray[1...N]    int minsum=0;    sum=0;    for(i=0;i<n;++i){        if(sum+vec[i]>=0){            sum=0;        }else{            sum+=vec[i];        }        if(sum<minsum){            minsum=sum;        }    }    //maxsum start from 0, find the position where sum reach max    sum=0;    int maxi=0;    int pi,pj;    for(i=0;i<n;++i){        sum+=vec[i];        if(sum>maxi){            maxi=sum;            pi=i;        }    }    //maxsum start from N-1, find the position where sum reach max    sum=0;    int maxj=0;    for(i=n-1;i>=0;--i){        sum+=vec[i];        if(sum>maxj){            maxj=sum;            pj=i;        }    }    if(pi<pj)        return max(maxsum,maxi+maxj);    else        return max(maxsum,sumtotal-minsum);}int main(){    vector<int> vec;    int n,x,i;    while(cin>>n){        for(i=0;i<n;++i){            cin>>x;            vec.push_back(x);        }        cout<<solve(vec)<<endl;        vec.clear();    }    return 0;}

原创粉丝点击