主要代码:
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比较
}