最大连续子序列和(分治法)

给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 }
原文地址:https://www.cnblogs.com/justPassBy/p/4852514.html