最大連續和(分治法)O(nlogn)
阿新 • • 發佈:2019-01-07
分解:將序列分解成元素個數儘量相等的子序列,求出每個子序列的最大連續和
合併:合併子問題得到原問題的解,由於最大連續和的子序列要麼完全在中點左邊,要麼完全在中點右邊,要麼就是橫跨左右兩邊,所以比較這幾種情況就可得出當前序列的最大連續和
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);//取兩種情況中最大的
}