最大子段和

给定由n个整数(可能有负数组成的序列 a1,a2 a3,....an),要在这n个数中选取相邻的一段ai,a(i+1)....aj 使其和最大,当所有整数均为负数时,定义最大字段和为0. 

       b[j]=max{b[j-1]+a[j],a[j]}

#include <iostream>
using namespace std;
int a[1001];
int besti,bestj;
int MaxSum(int n){
    int sum=0,b=0,beg=0;
    besti=0,bestj=0;
    for(int i=0;i<n;i++){
        if(b>0){
            b+=a[i];
        }else{
            b=a[i];
            beg=i;
        }
        if(b>sum){
            sum=b;
            besti=beg;
            bestj=i;
        }
    }
    return sum;

}
int main(){
    int n;
    while(cin>>n){
        memset(a,0,sizeof(a));
    for(int i=0;i<n;i++){
        cin>>a[i];
       }
    cout<<MaxSum(n)<<endl;
    cout<<besti<<"  "<<bestj<<endl;
    }
    return 0;
}

 

posted @ 2015-11-14 19:42  咸咸的告别  阅读(111)  评论(0编辑  收藏  举报