1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| /**
* 分治,划分为作用两个字数组
* A[l,...,M], A[M+1,...,R]
* 则最大子序列和来自三部分:左侧的最大子序列和,右侧的最大子序列和,跨越A[M]和A[M+1]的最大子序列号
* 1,2情况递归可以完成,情况三其实就是求最测以A[M]结尾的最大和,右侧就是以A[M+1]开头的最大和
*
* 时间复杂度:T(n) = 2T(n/2) + O(n)
* 即 O(nlogn)
*/
int Chapter2::maxSubSeqSum3(const int A[], int L, int R)
{
if(L == R) return A[L] < 0 ?0 : A[L];
int M = (L + R) >> 1;
int maxSumL = maxSubSeqSum3(A, L, M);
int maxSumR = maxSubSeqSum3(A, M+1, R);
int maxL = 0, sumL = 0;
for(int i = M; i>=L; i--)
{
sumL += A[i];
if(sumL > maxL) maxL = sumL;
}
int maxR = 0, sumR = 0;
for(int i = M+1; i<=R; i++)
{
sumR += A[i];
if(sumR > maxR) maxR = sumR;
}
return max(max(maxSumL, maxSumR), maxL+maxR);
}
|