最大连续和,给出一个长度为n的序列,求一段子序列,要求和最大。
分析:分治法,分为三段,左,中,右,
int maxs = max(maxsum(A, x, m), maxsum(A, m, y));//左和右分别求最大值
v = 0; L = A[m - 1];
for (int i = m - 1; i >= x; i--)
L = max(L, v += A[i]);
v = 0; R = A[m];
for (int i = m; i < y; i++)
R = max(R, v += A[i]);
return max(maxs, L + R);//中
//求完再比较大小
递归到每个子序列,分别求其和最大。
int maxsum(int *A, int x, int y) {
int v, L, R, maxs;
if (y - x == 1)return A[x];
int m = x + (y - x) / 2;
int maxs = max(maxsum(A, x, m), maxsum(A, m, y));
v = 0; L = A[m - 1];
for (int i = m - 1; i >= x; i--)
L = max(L, v += A[i]);
v = 0; R = A[m];
for (int i = m; i < y; i++)
R = max(R, v += A[i]);
return max(maxs, L + R);
}
时间复杂度为n(logn)。