动态规划论文【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划算法及算法思路的分析 石家庄二中 贾志豪 [关键字] 动态规划 状态表示 状态转移 最优化原理 无后效性 [摘要] 在信息学竞赛中,我们经常遇到求最优解的问题。这些问题的特点是,只需要求出最优解,而不要求写出最优解的具体情况。为了解决这类问题,我们经常会用到一种有效的算法——动态规划。使得我们可以在有限的时间内,求出问题的解。本文首先介绍一些关于动态规划的理论知识,然后将介绍向动态规划的思路上靠拢的方法——即如何思考,最后再介绍一些经典例题。希望大家能互相促进。 我的邮箱是: dugushuiyi@ QQ:396511873 [目录] 一 动态规划的理论知识 1.1 动态规划的基本思想 1.2动态规划问题的特征 1.3使用动态规划的原则 二 解题时的思路——如何向动态规划上靠拢 2.1 分析问题是否符合动态规划的原则 2.2 确定使用动态规划时的状态和状态转移 2. 3 估计程序的时间、空间复杂度及编程的难易程度 三 一些经典例题 四 习题 [正文] 一 动态规划的理论知识 1.1动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。(本段文字摘自国家集训队论文) 1.2动态规划问题的特征 动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。 1、最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 2、重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。1、可以通俗地理解为子问题的局部最优将导致整个问题的全局最优,即问题具有最优子结构的性质,也就是说一个问题的最优解只取决于其子问题的最优解,非最优解对问题的求解没有影响。所谓无后效性原则,指的是这样一种性质:某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。具体地说,如果一个问题被划分各个阶段之后,阶段 I 中的状态只能由通过状态转移方程得来,与其他状态没有关系,特别是与未发生的状态没有关系,这就是无后效性。 在思考状态表示时,就不得不去考虑无后效性问题了(笔者认为,在第一步中一般不过多的考虑无后效性问题),状态的表示一般用数组来实现,大多数情况下,数组的第一个下标用来表示执行到第几个阶段(有一些程序在最外层嵌套For 语句除外),之后的几个下标用来表示用来实现无后效性。(笔者建议,数组的维数最好不要超过5维,因为维数过多会使重叠子问题变少,增加时间、空间复杂度和编程的难易度)。在确定了状态表示后,我们的动态规划就实现了一半了。 确定状态转移(方程)。在确定了状态表示之后,就需要去确定状态转移方程(事实上,这两部是在同时进行的)。在这里,笔者要提醒的是,状态转移方程必须要正确,因为状态转移方程失之毫厘,最后的结果就会差之千里(读者可以想一想递归树和递归方程)。最后要提醒的是,某些人在使用动态规划时,经常回担心边界条件的正确与否,事实上,只要状态转移方程是对的,边界条件一般不会出错(有经验的读者会深表赞同)。 最后:估计程序的时间、空间复杂度及编程的难易程度 一位以上三个参量是评价算法在解决问题时的优劣标准。 一般情况下,动态规划的空间复杂度近似于时限状态的数组大小,时间复杂度=状态数*决策数目*转移费用(刘汝佳观点),一般的,这个公式的结果为O(n^(1+状态数组维数));大家可想而知,大状态数组维数过多时,动态规划并不是一个很好的算法。对于编程复杂度,其参数值因题而异,在这里就不作介绍。 三 一些经典例题 1、货币系统Section 2.2 PROB: Money Systems) 母牛们

文档评论(0)

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

1亿VIP精品文档

相关文档