最大连续和算法分析
来源:互联网 发布:油画棒 知乎 编辑:程序博客网 时间:2024/06/06 18:43
1. 描述:
给出一个长度为N的序列:a1,a2,……,an,求最大连续和。找到1=<I<=J<=N,使得ai+a(i+1)+……+aj尽量大。
2. 算法一:先求出所有的和S[1],S[2],……,ai+a(i+1)+……+aj=S[J]-S[I-1].
代码:
s[0]=0;
int best=a[1];
for(int i=1;i<=n;i++)
{
s[i]=s[i-1]+a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
best=max(best,s[j]-s[i-1]);
}
}
4. 算法二:
int best=a[1];
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=i;j<=n;j++)
{
sum=sum+a[j];
best=max(best,sum);
}
}
5. 算法三:分治法
共三步:
划分问题:将问题的事例划分成子问题。把序列分成元素个数尽量相等的两半。
递归求解:递归解决子问题。分别求出完全位于左半或者完全位于右半的最佳序列。
合并问题:合并子问题的解得到原问题的解。求出起点位于左半,终点位于右半的最大连续和序列,并和子问题的最优解进行比较。
int maxsum(int *A,int x,int y) //返回数组在左闭右开区间[x,y)中的最大连续和
{
int v,L,R,maxs;
if(y-x==1)//只有一个元素,直接返回
{
return a[x];
}
int m=x+(y-x)/2;//分治第一步:划分成[x,m)和[m,y)
maxs=max(maxsum(A,x,m),maxsum(A,m,y));//分治第二步:递归求解
v=0;//分治第三步(1):开始从分界点往左求最大连续和:L
L=a[m-1];
for(int i=m-1;i>=x;i--)
{
L=max(L,v=v+a[i]);//赋值运算本身具有返回值
}
v=0;//分治第三步(2):开始从分界点往右求最大连续和:R
R=A[m];
for(int i=m;i<y;i++)
{
R=max(R,v=v+A[i]);
}
return max(maxs,L+R);//把子问题的解和L+R比较
}
关于分界点的计算:
运算符‘/’的取整是朝零方向的取整,x+(y-x)/2使得分界点总是靠近区间起点。
- 最大连续和算法分析
- 高效算法设计_算法分析初步(最大连续和)
- 以最大连续和为例的算法分析
- 最大连续区间和算法、
- 求“最大连续段和”题目分析
- 算法导论 - 最大和连续子数组
- 【算法】最大连续子数组和
- 最大连续区间和的算法总结
- 【java-算法】连续数组最大和
- 算法题/最大连续子序列和
- [数据结构与算法分析] 求连续子数组的最大和问题
- 算法分析——最大连续子序列和的问题
- 图割与最大流和连续最大流算法
- 算法---最大连续乘积
- 【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现
- 数据结构与算法分析笔记与总结(java实现)--数组5:连续子数组的最大和
- 算法设计与分析——动态规划方法求解序列的连续最大子段和
- 连续子序列最大和问题的分析
- 设计模式——模板方法
- 旋转矩阵180度
- ASP通过http调用验证码短信接口源码
- Android开发历程
- SQLITE3 使用总结
- 最大连续和算法分析
- Linux下/proc目录简介
- logo二维码
- 荒岛余生Cast Away——那个名叫威尔森的人
- Github- iOS备注 (不定时的更新)
- 尚硅谷十大培训课程教学课件合集
- Markdown 编辑器
- eclipse svn 同步与清理发生内存溢出
- 关于 UIWebView reload 失效的 一种情况