给出一个长度为n的序列,求连续最大和。
递归求解是分别求出位于左半部分和右半部份的最优解。
合并是找起点在左边的,终点在右边的最优解,并和左右部分最优的进行比较。
代码如下。
时间复杂度o(NlogN)
int maxsum(int *A, int x, int y){ int middle, value, L, R, mmax; if(y-x == 1) return A[x]; ///只有一个元素,直接返回 middle = x + (y-x)/2; ///第一步:划分区间为[x,m) [m,y) mmax = max(maxsum(A, x, middle), maxsum(A, middle, y)); ///第二步:递归求解 value = 0; ///第三步:从分界点开始向左的最大连续和L L = A[middle-1]; for(int i = middle-1; i >= x; i--){ value += A[i]; L = max(L, value); } value = 0; ///第三步:从分界点开始向右的最大连续和R R = A[middle]; for(int i = middle; i < y; i++){ value += A[i]; R = max(R, value); } return max(mmax, (L+R)); ///二者比较取最大 }