分治法求最大连续和

来源:互联网 发布:ubuntu 17.10 安装后 编辑:程序博客网 时间:2024/05/01 23:27

给出一个长度为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));   ///二者比较取最大}

原创粉丝点击