问题:

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为:
  
    Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为20。

问题求解:

/*简单算法:
**v[0]不保存数据
**T(n)=O(n^2).
*/
int MaxSum(int *v,int n,int *besti,int *bestj)
{int sum=0;int i,j;for (i=1;i<=n;i++){int thissum=0;for (j=i;j<=n;j++){thissum+=v[j];if (thissum>sum){sum=thissum;*besti=i;*bestj=j;}}}return sum;
}
/*分治法:
**将a[1n]分成a[1n/2]和a[n/2+1n],则a[1n]的最大字段和有三种情况:
**(1)a[1n]的最大子段和与a[1n/2]的最大子段和相同
**(2)a[1n]的最大子段和与a[n/2n]的最大子段和相同
**(3)a[1n]的最大子段和为ai++aj,1<=i<=n/2,n/2+1<=j<=n
**T(n)=2T(n/2)+O(n)
**T(n)=O(nlogn)
*/
int MaxSum_DIV(int *v,int l,int r)
{int k,sum=0;if(l==r)return v[l]>=0?v[l]:0;else{int center=(l+r)/2;int lsum=MaxSum_DIV(v,l,center);int rsum=MaxSum_DIV(v,center+1,r);int s1=0;int lefts=0;for (k=center;k>=l;k--){lefts+=v[k];if(lefts>s1)s1=lefts;}int s2=0;int rights=0;for (k=center+1;k<=r;k++){rights+=v[k];if(rights>s2)s2=rights;}sum=s1+s2;if(sum<lsum)sum=lsum;if(sum<rsum)sum=rsum;}return sum;
}
/*动态规划算法:
**b[j]=max{a[i]++a[j]},1<=i<=j,且1<=j<=n,则所求的最大子段和为max b[j],1<=j<=n。
**由b[j]的定义可易知,当b[j-1]>0时b[j]=b[j-1]+a[j],否则b[j]=a[j]。故b[j]的动态规划递归式为:
**b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。
**T(n)=O(n)
*/
int MaxSum_DYN(int *v,int n)
{int sum=0,b=0;int i;for (i=1;i<=n;i++){if(b>0)b+=v[i];elseb=v[i];if(b>sum)sum=b;}return sum;
}

最大子段和——分治与动态规划相关推荐

  1. 最大子段和 分治与动态规划

    问题:   给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整均为负数时定义子段和为0,依此定义 ...

  2. 最大子段和问题 蛮力法、分治法和动态规划效率比较(C++实现)

    进行比较的代码如下,其中分别给出了用蛮力法.分治法和动态规划法求解最大子段和问题的函数: #include<iostream> #include<ctime> using na ...

  3. ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​

    相似算法比较:递归.分治.动态规划.贪心.回溯.分支限界 ​ 在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们 ...

  4. 分治、动态规划、贪婪 之 算法分析

    分治.动态规划.贪婪  之 算法分析 分治与动态规划都用到了递归的思想,但是对他们之间的区别在概念上一直比较模糊,今天附带贪婪选择稍微整理一下他们. 算法之道上说,标准分治.动态规划.贪婪选择称得上是 ...

  5. 分治:分治和动态规划的区别,二分检索递归和迭代方式实现

    分治法 分治一般可以直接使用递归实现,在不考虑空间消费的情况下和迭代方式时间消耗相差不多 ======================================================= ...

  6. 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较

    在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下. 一.算法思想 ...

  7. 最大子段和问题(分治法和动态规划)

    什么是最大子段和,通俗点讲: 最大子段和就是给了一些数,然后你从中找了几个连续的数,这组连续的数的和比任意一组连续的数的和都大,那么你找的这几个连续的数的和就是这些数的最大子段和. 通俗的听不懂你就看 ...

  8. ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)

    [0]README 1)本文旨在介绍算法设计技巧包括 贪婪算法.分治算法.动态规划 以及相关的荔枝等: [1]贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的 ...

  9. 五大常用算法:分治、动态规划、贪心、回溯、分支限界

    2019独角兽企业重金招聘Python工程师标准>>> 分治:把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问 ...

最新文章

  1. c语言和c++字符串操作对比
  2. 从QQ聊天看51CTO版主专业精神和工作态度!
  3. C语言playsoundw函数,使用inline hook实现修改PC微信通知铃声-哥哥微信来了
  4. php controller 间调用,php – 在CodeIgniter中的另一个Controller中调用Controller函数
  5. 服务器怎么导出数据库文件,怎么导出服务器数据库文件
  6. 项目实践精解:C#核心技术应用开发
  7. python中random中uniform怎么用_Python中的random.uniform()函数教程与实例解析
  8. 【theano-windows】学习笔记六——theano中的循环函数scan
  9. 11部高分学科纪录片,助力孩子涨姿势拓视野~
  10. java基础学习笔记(二)
  11. Python自定义包
  12. Java分段函数选择结构,编程流程作业选择结构(50题)
  13. VRRP的基本配置(以H3C模拟器为例)
  14. Verilog入门教程与实例分享
  15. Android 系统鼠标
  16. 报考上传照片时显示服务器错误,报考上传照片所遇问题及解决方法(转载)
  17. Windows系统中的睡眠时间和关闭屏幕时间的设置
  18. 【期末大作业】公益网站ps平面设计
  19. 计算机平时测试零分,计算机二级最全攻略 就快考试了不看等什么呢!
  20. 【读书笔记】增长黑客

热门文章

  1. 【Android 逆向】Android 系统文件分析 ( 根目录下的目录和文件 | /data/ 应用和用户数据目录 | /mnt/ 挂载其它设备目录 )
  2. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )
  3. 【Android 应用开发】Android 工程修改包名流程 ( 修改 applicationId | 修改 package | 修改 R 资源引用 | 修改 BuildConfig 引用 )
  4. 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
  5. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
  6. 虚拟机VM三种网络连接方式说明
  7. GitLab使用自定义端口
  8. 对B样条的理解和整理
  9. VS2017学习OpenGL时遇到的一些小问题和解决方法
  10. 【python初识】数据和对象