- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划(线性)--第三课时
动态规划第二课 线性动态规划 一、最优结构 二、重叠子问题 三、记忆化(有时候有用) 一、最优结构 用动态程序设计方法来解决一个问题的第一步是刻划一个最优解的结构。我们说一个问题具有最优子结构性质,如果该问题的最优解中应包含了一个或多个子问题的最优解。当一个问题呈现出最优子结构时,动态程序设计可能就是一个合适的候选方法了。 例如:数字三角形问题具有最优子结构。 适合于动态规划方法解决的最优化问题必须具有的第二个要素是子问题空间要较小,也就是用来解原问题的一个递归算法可反复地解同样的子问题,而不是总在产生新的子问题,即子问题的总数是问题规模的一个多项式。当一个递归算法不断地遇到同一问题时,我们说该最优化问题包含有重叠子问题。相反地,适合用分治法解决的问题往往在递归的每一步都产生出全新的问题来,如快速排序算法。动态总是充分得用重叠子问题,对每个子问题只解一次,把解放在一个数组中,需要时直接查看就行。 二、重叠子问题 动态规划算法一般都是用自底向上的递推来实现,具体来说就是从递归式的边界条件出发,按问题规模从小到大依次求出每个子问题的最优解,直至求出问题最终的最优解为止,这一过程通常可用循环结构实现。 三、记忆化 现实的递归实现过程中会出现多次重复解相同的子问题可能会导致整个程序执行速度变慢! 那么动态规划算法能不能用自顶向下的递归策略加以优化来实现呢? 如果我们将每个子问题的最优解在第一次递归求出后保存起来,今后遇到要递归求相同的子问题的最优解时,我们先看一看这个子问题解过没有,如解过即不再进行递归调用,直接将前面求得的最优解取出使用。这就是记忆化的方法,它的时间复杂度与自底向上的递推一致。 一个记忆化的递归算法需要开辟一个数组用来记录每个子问题的最优解,开始时该数组中每个元素都包含一个特殊值,表示该子问题的最优解尚未解出,当在递归算法中。 一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 (1)分析最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。 (4)根据计算最优值时得到的信息,构造一个最优解。 步骤(1)~(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。 设计一个动态规划算法,通常可按以下几个步骤进行: 最长公共子序列 [问题描述] 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=x1,x2,……,xm,则另一序列Z=z1,z2,……,zk是X的子序列是指存在一个严格递增的下标序列 i1,i2,……,ik,使得对于所有j=1,2,……,k有: 例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相应的递增下标序列为2,3,5,7。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=A,B,C,B,D,A,B和Y=B,D,C,A,B,A,则序列B,C,A是X和Y的一个公共子序列,序列B,C,B,A也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。 给定两个序列X=x1,x2,……,xm和Y=y1,y2,……,yn,要求找出X和Y的一个最长公共子序列。 [输入] 输入文件共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。 [输出] 输出文件第一行为一个非负整数,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出文件仅有一行输出一个整数0,否则在输出文件的第二行输出所求得的最长公共子序列(也用一个大写字母组成的字符串表示),若符合条件的最长公共子序列不止一个,只需输出其中任意的一个。? [输入样例] LCS.IN ABCBDAB BDCABA [输出样例] LCS.OUT 4 BCBA 问题一 按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法: 1.最长公共子序列的结构 求最长公共子序列问题时最容易想到的算法是穷举搜索法,即对X的每一个子序列,检查它是否也是Y的子序列,从而
文档评论(0)