您的位置:首页 > 编程语言

编程珠玑 8.3分治法的错误 连续子向量的最大和

2014-03-19 16:46 309 查看
问题描述:

问题输入是具有n个数的向量x,输出是输入向量的任何连续子向量的最大和

要解决这个规模为n的问题,可递归的解决两个规模近似为n/2的子问题,然后对它们的答案进行合并以得到整个问题的答案

假设数组A 【l......u】

mid=(l+u)/2;

A[l....mid] 最大的连续的最大值为 lmax 下标是从i_1.......j_1

A[mid....u]最大的连续的最大值为rmax 小标是 从 i_2 ...j_2

则A[l...u]的最大值为 max ,可能是 lmax 或rmax 或 经过mid的左右 得到的最大值

书上的代码:

float maxsum3(l,u)

{

if(l>u) return 0;

if(l==u) return max(0,x[1]);

lmax=sum=0;

for(i=m;i>=1;i--)

sum+=x[i]

lmax=max(lmax,sum)

rmax=sum=0;

for i=(m,u]

sum+=x[i]

rmax=max(rmax,sum)

return max(lmax+rmax,maxsum3(l,m),maxsum3(m+1,u))

}

我觉得

对于小子向量

l>u(不含元素的时候) 返回0

l=u(一个元素的时候 ) 返回A[l]

否则

代码如下

#define max(a,b)  a>b?a:b

int max2(int a,int b,int c)
{
	if(a>b&&a>c)
		return a;
	else if(b>a&&b>c)
		return b;
	else return c;	
}  
int maxsum(int l,int u)
{
	int i,m,sum,lmax,rmax;
	if(l>u)
		return 0;
	if(l==u)
		return a[l];//1 个元素的时候
        m=(l+u)/2;
	//此时 l<u 至少含有2个元素
	lmax =-0xffff; sum =0;//lmax为了设置为负无穷大
	for(i=m;i>=l;--i)
   	{
		sum += a[i];
		lmax =max(lmax,sum);
	}
	
	printf("m=:%d\n",m);
	rmax =-0xffff;sum =0;//lmax为了设置为负无穷大
	for(i=m+1;i<=u;++i)
	{
		sum += a[i];
		rmax =max(rmax,sum);
	}
	return max2(lmax + rmax , maxsum(l,m) , maxsum(m+1,u) );
}
欢迎大家提出意见,相互学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: