第5讲动态规划.ppt

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

MSTC课堂 什么是动态规划 前面我们讲解了用递归方法解决问题。但是,单纯的递归,在解决某些问题的时候,效率会很低。 我们看这样一个例题。 数字三角形 问题描述: 图中给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。 注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。 数字三角形 输入数据:输入的第一行是一个整数N(1N=100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0到100之间。 输出要求:输出最大的和. 输入样例: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例: 30 数字三角形 解题思路: 这道题目如果用递归的方法解决。思路如下: 以D(r,j)表示第r行第j个数字(r,j都从1开始算),以MaxSum(r,j)代表从第r行的第j个数字到底边的最佳路径的数字之和,则本题要求MaxSum(1,1)。 从某个D(r,j)出发,显然下一步只能走D(r+1,j)或者D(r+1,j+1)。如果走D(r+1,j),那么得到的MaxSum(r,j)就是MaxSum(r+1,j)+D(r,j);如果走D(r+1,j+1),那么得到的MaxSum(r,j)就是MaxSum(r+1,j+1)+ D(r,j)。所以,选择往哪里走,就看MaxSum(r+1,j)和MaxSum(r+1,j+1)哪个更大了。 数字三角形 程序分析: 上面程序的效率非常低,在N值并不大,比如N=100的时候,就慢得几乎永远算不出结果了。为什么呢?因为过多的重复计算。 我们将对MaxSum函数的一次调用称为一次计算。那么,对于N行的三角形,总的计算次数是20+21+22+…+2N-1 =2N-1。当N=100时,计算次数是一个大数字。 既然问题出在重复计算,那么解决的办法就是,一个值一旦算出来,就要记住,以后不必重新计算。这样,对于数字三角形来说,总的计算次数就是1+2+3+…+N=N(N+1)/2。 数字三角形 程序分析: 如何存放计算出来的MaxSum(r,j)的值呢?显然,用一个二维数组aMaxSum[N][N]就能解决。 aMaxSum[r][j]就存放MaxSum(r,j)的计算结果。下次再需要MaxSum(r,j)的值时,不必再调用MaxSum函数,只需直接取aMaxSum[r][j]的值即可。 什么是动态规划 这种将一个问题分解为子问题递归求解,并且将中间结果保存以避免重复计算的方法,就叫做“动态规划”。 动态规划通常用来求最优解,能用动态规划解决的求最优解问题,必须满足:最优解的每个局部解也都是最优的。 以上题为例,最佳路径上的每个数字到底部的那一段路径,都是从该数字出发到达底部的最佳路径。 什么是动态规划 实际上,递归的思想在编程时未必要实现为递归函数。在上面的例子里,有递推公式: 因此,不需要写递归函数,从aMaxSum[N-1]这一行元素开始向上逐行递推,就能求得最终aMaxSum[1][1]的值了。 动态规划解题的一般思路 许多求最优解的问题可以用动态规划来解决。 用动态规划解题,首先要把原问题分解为若干个子问题,这一点和前面的递归方法类似。区别在于,单纯的递归往往会导致子问题被重复计算,而用动态规划的方法,子问题的解一旦求出就会被保存,所以每个子问题只需求解一次。 子问题经常和原问题形式相似,有时甚至完全一样,只不过规模从原来的n变成了n-1,或从原来的n*m变成了n*(m-1),等等。找到子问题,就意味着找到了将整个问题逐渐分解的方法,因为子问题可以用相同的思路分解成子子问题,一直分解下去,直到最底层规模最小的子问题可以一目了然地看出解。 每一层子问题的解决,会导致上一层子问题的解决,逐层向上,就会导致最终整个问题的解决。如果从最底层的子问题开始,自底向上地推导出一个个子问题的解,那么编程的时候就不需要写递归函数。 动态规划解题的一般思路 用动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称为一个“状态”。 一个“状态”对应于一个或多个子问题,所谓某个“状态”下的值,就是这个“状态”所对应的子问题的解。 定义出什么是“状态”,以及在该“状态”下的“值”后,就要找出不同的状态之间如何迁移——即如何从一个或多个“值”已知的“状态”,求出另一个“状态”的“值”。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。 最长上升子序列 问题描述: 一个数的序列bi,当b1b2…bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2

文档评论(0)

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

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

1亿VIP精品文档

相关文档