最大子段和.ppt

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最大子段和

算法设计与分析 动态规划 杨圣洪 3.4 最大子段和 问题描述: 给定由n个整数(可为负)组成的序列a1,a2,...,an,求该序列子段(连续元素)和的最大值。当和为负值时约定为0。 依此定义,所求的最优值为:(板) 例如,(2,11,-4,13,-5,-2)最大子段和=2+11+(-4)+13=22。(板) 连续子集与公子序列,离散子集并不一样!!! 暴力求连续子集: 起点i从1到n,终点j从i~n,,O(n3) 一个简单算法 一个简单算法:连续元素和 int MaxSum(int n, a, besti, bestj) { //起点为i,结束点为j,一段试过去 int sum=0; for(i=1;i=n;i++) for(j=i;j=n;j++){ int thissum=0; for(k=i;k=j;k++) {thissum+=a[k];} if(thissumsum){ sum=thissum; besti=i; bestj=j; } } return sum; } 算法有3重循环,复杂性为O(n3)。 由于和是 逐渐累加 改进: int MaxSum(int n, a, besti, bestj) { int sum=0; for(i=1;i=n;i++){ int thissum=0; for(j=i;j=n;j++){ thissum+=a[j]; if(thissumsum){ sum=thissum; besti=i; bestj=j; } } } } 改进后的算法复杂性为O(n2) 。 2. 分治方法求解 分治法:a[left:right]分为a[1:center],a[center+1:n]: A) a[left:right]与a[left:center] 相同. B) a[left:right]与a[center+1:right] 相同; C)a[left:right]最大子段和横跨两段aleft+ai+1 +…an/2+an/2+1…+aright A、B递归求得。C直接求?分别求出两子段最大和 分治算法(板分划图) 2. 分治方法求解 分治法:将a[left:right]分为a[left:center]和a[center+1,right]: a[left:right]的最大子段和与a[left:center]的最大子段和相同; a[left:right]的最大子段和与a[center+1:right]最大子段和相同; a[left:rigt]最大子段和横跨两段ai+ai+1+…an/2+an/2+1…+aj A、B递归求得。C先求a[left:center]和a[center+1:right]的最大子段和s1和s2,再求s1+s2。不必像前法求交叉段最大和 递归仅大化小! 分治法的基本思想 分治法的基本思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 动态规划基本步骤 找出最优解的性质,并刻划其结构特征。判断整体最优是否有局部最优 递归定义最优值。有难度。 以自底向上的方式计算出最优值。非递归 根据计算最优值时得到的信息,构造最优解。! 3. 动态规划方法求解 a1,a2,…,ai,…,aj,…an中最大子段和ai+ai+1+…+aj,结束点j在[1,n]之间,起点i在[1,j] 。先终点后起点,提出共同的终点 bj是终点为j的子段和的最大值,其值可迭代出来。 当bj-10时bj=bj-1+aj,否则清零重新开始累加bj=aj。(板,动板推导) 递归式bj=max{bj-1+aj,aj},1≤j≤n。每求出一个bj,判断是否当前最大 3. 动态规划方法求解 最大子段和是ai+ai+1+…+aj的最大值,为a1,a2,…,ai,…,aj,…an中一段的最大值,结束点j在[1,n]之间,起点i在[1,j] 。先终点后起点,提出共同的终点 bj是终点为j的子段和的最大值,其值可迭代出来。 当bj-10时bj=bj-1+aj,否则bj=aj。 递归式bj=max{bj-1+aj,aj},1≤j≤n。每求出一个bj,判断是否当前最大 int MaxSum(int n, int a){ //板 int sum=0; //整体最优 b=0; //终点为j的子段最大值 for (j=1;j=n;j++

文档评论(0)

wangyueyue + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档