1. 程式人生 > >最大序列和

最大序列和

() post std stream 數組 BE class pac 增加


數組中整數有正有負
求一連續子段,使得和最大化
例如:
2,4,-7,5,2,-1,2,-4,3
最大連續段:
5,2,-1,2

其最大和為8

#include<iostream>
using namespace std;
int f(int a[],int begin,int end)//[begin,end)左閉右開 
{
    if(end-begin==1){
        if(a[begin]>0) return a[begin]; 
        return 0;
    }
    int k=(begin+end)/2;
    int t1=f(a,begin,k);//
不包含k int t2=f(a,k,end); int t3a=0;//從中間向左邊去擴展,看最大是多少 int sum=0; for(int i=k-1;i>=begin;i--)//從中間往前加,看最大是多少, { sum+=a[i]; if(sum>t3a)t3a=sum;//向左擴展的結果 } int t3b=0; sum=0; for(int i=k;i<end;i++)//從中間往後加,看最大是多少, { sum+=a[i]; if
(sum>t3b)t3b=sum;//向右擴展的結果 } int t3=t3a+t3b; int max=0; if(t1>max)max=t1; if(t2>max)max=t2; if(t3>max)max=t3; return max; } int work(int a[]) { return f(a,0,9);//增加參數容易遞歸 } int main() { int a[9]={2,4,-7,5,2,-1,2,-4,3}; cout<<work(a)<<endl;
return 0; }

最大序列和