1. 程式人生 > >最大連續和(分治法)O(nlogn)

最大連續和(分治法)O(nlogn)

分解:將序列分解成元素個數儘量相等的子序列,求出每個子序列的最大連續和
合併:合併子問題得到原問題的解,由於最大連續和的子序列要麼完全在中點左邊,要麼完全在中點右邊,要麼就是橫跨左右兩邊,所以比較這幾種情況就可得出當前序列的最大連續和

int maxsum(int l,int r){
    if(l==r)return a[l];
    int m=(l+r)/2;
    int Max=max(maxsum(l,m),maxsum(m+1,r));//(分解)情況1:完全在左區間,或者完全在右區間

    //(合併)情況2:橫跨左右兩個區間
    int suml=a[m],t=0;
    for
(int i=m;i>=l;i--) suml=max(suml,t+=a[i]); int sumr=a[m+1];t=0; for(int i=m+1;i<=r;i++) sumr=max(sumr,t+=a[i]); return max(Max,suml+sumr);//取兩種情況中最大的 }