编程珠玑 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]
否则
代码如下
问题输入是具有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) ); }欢迎大家提出意见,相互学习。
相关文章推荐
- [编程珠玑]-第八章:连续子向量的最大和
- 编程珠玑第八章——分治算法求解数组中的最大的连续和
- 模式识别-查找向量中元素之和最大的连续子向量---编程珠玑
- 编程珠玑 求解最大字串和
- 连续子向量的最大和及时间度量
- 我学编程时犯的最大两个错误(cocoachina)
- PHP XML Socket编程 服务端接收到多个连续xml等错误的解决办法
- 分治法解最大连续公共子序列
- 题目1372:最大子向量和(连续子数组的最大和)
- 最大子向量和(连续子数组的最大和)
- 程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离
- 编程珠玑第五章习题五——C++实现二分搜索时进行错误检测
- n元一维向量旋转问题(编程珠玑--第2章--问题B )
- 分治法对最大连续和以及归并排序,分治与递归实质把问题区间区域分割成几个小区间或者小分区,一直下钻到一个元素小区解决问题
- 【编程珠玑-读书笔记】算法设计技术—以求解"最大连续子序列和"为例
- HDU-1231,最大区间连续和总结-分治法-dp
- 程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离
- 最大连续和(分治法)
- 九度题目1372:最大子向量和(连续子数组的最大和) 剑指offer
- 程序员编程艺术:第七章、求连续子数组的最大和