[算法入门经典] 8.1.3 分治法 求最大连续和

主要代码: 

int maxsum(int *A,int x,int y) //返回数组在左比右开区间[x,y)中的最大连续和
{
    int i, m, v, L, R, max;
    if(y-x==1) return A[x]; //只有一个元素,直接返回
    m=x+(y-x)/2; //分治第一步:划分成[x,m)和[m,y)
    max=maxsum(A,x,m)>maxsum(A,m,y)?maxsum(A,x,m):maxsum(A,m,y);//分治第二步:递归求解
    //上面求的是没有跨过中点的[x,m)和[m,y)中的连续和的最大值
    //下面的代码是求跨过中点的最大值(即从分界点往左延伸的最大值+往右延伸的最大值),然后与之前求得max取两者最大值
    v=0; L=A[m-1];//分治第三步:合并(1)——从分界点开始往左的最大连续和L
    for(i=m-1;i>=x;i--) //L>?=v+=A[i];
    {
        v+=A[i];
        if(L<v)
        {
            L=v;
        }
    }
    v=0;R=A[m];  //分治第三步:合并(2)——从分界点开始往右的最大连续和R
    for(i=m-1;i<y;i++) //R>?=v+=A[i];
    {
        v+=A[i];
        if(R<v)
        {
            R=v;
        }
    }
    return max>(L+R)?max:(L+R);//max>?(L+R);//把子问题的解与L和R比较

}

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/82724895
今日推荐