最大连续子序列和(分治法)
给n个数,要求n个数的最大连续子序列和。 DP在O(n)的时间内就能求出,很简单。
但这里用分治的思想去做, 复杂度是O(nlogn), 二分用了O(logn),每次二分内的处理用了O(n)
将一个序列对半切(mid),那么这个最大连续子序列和要么在[l,mid],要么在[mid+1,r],要么跨越两边。
那么就要求出[l,mid]的最大连续子序列和, [mid+1,r]的连续子序列和, 跨越两边的连续子序列和
前两个问题是子问题,可以递归去解决。 所以只要解决第三个问题,然后返回三者中的最大者
第三个问题,我们可以从中间开始,分别向两边枚举。
枚举的时间复杂度是O(n),递归的深度是logn, 所以复杂度是O(nlogn)
1 int fenzhi(int L, int R) 2 { 3 if(L==R) 4 return a[L]; 5 int mid = (L+R)>>1; 6 int LSum = fenzhi(L,mid); 7 int RSum = fenzhi(mid+1,R); 8 int MidSum1 = 0 , MidSum2 = 0,tmp = 0; 9 for(int i=mid;i>=L; --i) 10 { 11 tmp += a[i]; 12 if(tmp>MidSum1) 13 { 14 MidSum1 = tmp; 15 } 16 } 17 tmp = 0; 18 for(int i=mid+1;i<+R;++i) 19 { 20 tmp += a[i]; 21 if(tmp>MidSum2) 22 MidSum2 = tmp; 23 } 24 return max(LSum,MidSum1+MidSum2,RSum); 25 }