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

给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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值