动态规划讲义(一).ppt

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

动态规划算法(一) 动态的人生,不妨随遇而安 ——YB 动态规划 与递推 Fibonacci数列的代表问题是由意大利著名数学家Fibonacci于1202年提出的“兔子繁殖问题”(又称“Fibonacci问题”)。 问题: 一个数列的第0项为0,第1项为1,以后每一项都是前两项的和,这个数列就是著名的裴波那契数列,求裴波那契数列的第N项。 解答 总结 从这个问题可以看出,在计算裴波那契数列的每一项目时,都可以由前两项推出。这样,相邻两项之间的变化有一定的规律性,我们可以将这种规律归纳成如下简捷的递推关系式:Fn=g(Fn-1),这就在数的序列中,建立起后项和前项之间的关系。然后从初始条件(或是最终结果)入手,按递推关系式递推,直至求出最终结果(或初始值)。很多问题就是这样逐步求解的。 对一个试题,我们要是能找到后一项与前一项的关系并清楚其起始条件(或最终结果),问题就可以递推了,接下来便是让计算机一步步了。让高速的计算机从事这种重复运算,真正起到“物尽其用”的效果。 递推概念 给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当nn0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hn(0in)联系起来,这样的式子就叫做递推关系。 如何建立递推关系 递推关系有何性质 如何求解递推关系 递推的形式 例1: Hanoi塔问题 Hanoi塔由n个大小不同的圆盘和三根木柱a,b,c组成。开始时,这n个圆盘由大到小依次套在a柱上,如图1所示。要求把a柱上n个圆盘按下述规则移到c柱上: (1)一次只能移一个圆盘; (2)圆盘只能在三个柱上存放; (3)在移动过程中,不允许大盘压小盘。 问将这n个盘子从a柱移动到c柱上,总计需要移动多少个盘次? 分析 设hn为n 个盘子从a柱移到c柱所需移动的盘次。显然,当n=1时,只需把a 柱上的盘子直接移动到c柱就可以了,故h1=1。当n=2时,先将a柱上面的小盘子移动到b柱上去;然后将大盘子从a柱移到c 柱;最后,将b柱上的小盘子移到c柱上,共记3个盘次,故h2=3。以此类推,当a柱上有n(n=2)个盘子时,总是先借助c柱把上面的n-1个盘子移动到b柱上,然后把a柱最下面的盘子移动到c柱上;再借助a柱把b柱上的n-1个盘子移动到c柱上;总共移动hn-1+1+hn-1个盘次。 ∴hn=2hn-1+1 边界条件:hn-1=1 例2:方格取数 在一个n×m的方格中,m为奇数,放置有n×m个数 ,如图,方格中间的下方有一人,此人可按照五个方向前进但不能越出方格,见右下图。 人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。 动态规划与递推的关系 上题实质上是采用动态规划来求解,那么与递推动态规划之间到底是什么关系呢? 我们不妨画个图(如下图)。而通常人们理解的递推关系就是一般递推关系,故认为动态规划与递推关系是两个各自独立的个体。 例2的简化版本 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给出如上图所示的n层数字三角。现在从顶点出发,每次只能向下或者向右下方移动一步。问最多能获得的价值(经过方格的数字之和)是多少? 如何储存数据 对于该类问题,我们要迅速的想到二维数组。(因为数据有行信息与列信息这二维) 用数组map[i][j]表示第i行第j列的数值是多少。当然,从c和c++语言出发,我们习惯性的从第0行第0列开始计数。 于是我们用两重for循环读入数据 for(i=0;in;i++) for(j=0;j=i;j++) scanf(“%d”,map[i][j]); 数组与数据一一对应 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 map[0][0]=7 map[1][0]=3 map[1][1]=8 map[2][0]=8 map[2][1]=1 map[2][2]=0 map[3][0]=2 map[3][1]=7 map[3][2]=4 [3][3]=4 问题分析 首先考虑直观的暴力枚举 分析:每一次必须向下移动一层,每次移动可以选择直接向下或者向右下移动 于是,我们从第一层出发,枚举每次的选择:用0来表示向下移动,用1表示向右下移动 总的状态数:2^n 其中数字总和最大的即为所求。 枚举法对应的操作 if(ste==0) sum+=map[i+1][j]; else sum+=map[i+1][j+1]; 技巧:由于n并不确定,所以嵌套循环的总数也不确定,因此需要用递归来生成需要的循环。 优点:直观 缺陷:时间复杂度太高,并且代码不易实现 尝试改进 因为题目要求我们获取

文档评论(0)

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

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

1亿VIP精品文档

相关文档