1. 程式人生 > >[演算法入門經典] 8.1.3 分治法 求最大連續和

[演算法入門經典] 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);//分治第二步:遞迴求解
    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比較

}