收藏 分享(赏)

dp算法思想及运用实践例题.doc

上传人:wspkg9802 文档编号:6545686 上传时间:2019-04-16 格式:DOC 页数:10 大小:251.50KB
下载 相关 举报
dp算法思想及运用实践例题.doc_第1页
第1页 / 共10页
dp算法思想及运用实践例题.doc_第2页
第2页 / 共10页
dp算法思想及运用实践例题.doc_第3页
第3页 / 共10页
dp算法思想及运用实践例题.doc_第4页
第4页 / 共10页
dp算法思想及运用实践例题.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、第 6 章动态规划最优化原理1951 年美国数学家 R.Bellman 等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。一些静态模型,只要人为地引进“时间”因素,分成 时段,就可以转化成多阶段的动态模型,用动态规划方法去处理。与此同时,他提出了解决这类问题的“最优化原理”(Principle of optimality):上述程序实现方法同样适合于背包问题,最 优库存问题等,只是针对具体情况,最优决策表的表示和生成会有所不同。“一个过程的最优决策具有这样的性质:即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态

2、的过程而言,必须构成最优策略”。简言之,一个最优策略的子策略,对于它的初 态和终态而言也必是最 优的。这 个 “最 优 化 原 理 ”如 果 用 数 学 化 一 点 的 语 言 来 描 述 的 话 ,就 是 :假 设 为 了 解 决 某 一优 化 问 题 ,需 要 依 次 作 出 n 个 决 策 D1,D2,Dn,如 若 这 个 决 策 序 列 是 最 优 的 ,对 于任 何 一 个 整 数 k,1 =0;j-) if(hi,另110ACM 程序设计培训教程一个序列 Z= 是 X 的子序列,如果存在严格递增 X 的序号序列,对于所有的 j = 1,2,.,k, 。例如 Z = 是 X = 的子

3、序列,对应jij在 X 中的序号为。给定两个序列 X 和 Y,找到 X 和 Y 的最长的公共子序列的长度。每组测试数据包含两个字符串表示给定的序列,中间用空格隔开。对于每个测试数据,输出最长的公共子序列的长度。abcfbc abfcabprogramming contest abcd mnp420动态规划求解令 X0 = Xi =x1,x2,xi,1imXm = XY0 = Yi =y1,y2,yi,1inYn = YLCS(Xi,Yj)表示(X i,Yj)的最长公共子序列长度,则有: 否 则若 ),(),(ax,( 11nmnmnm YXLCSLSzyxzYXCXLS一般有: 否 则若 ),

4、(),(,),( 11jijijiji zzY含义:111第 6 章 动态规划 若 xm=yn=z(或 xi=yj=z)则 xm,y n 必包含在 LCS(Xm,Yn)中。则,LCS(Xm,Yn) = LCS(Xm-1,Yn-1)z 若 xmy n,则 xm,y n 中至少有一个不会包含在 LCS(Xm,Yn)中,则,LCS(Xm,Yn)等于 LCS(Xm-1,Yn)和 LCS(Xm,Yn-1)中长的一个 若 i=0 或 j=0,则其中一个(X m 或 Yn)为空集合,此时 LCS(Xm,Yn)= 递推过程:为求 LCS(Xi,Yj),需要首先得到 LCS(Xi-1,Yj-1)或 LCS(Xi

5、-1,Yj)和 LCS(Xi,Yj-1)的值。故递推过程如下:从 i=0 或 j=0 算起,对所有 im的每个值,求 j=1n 的所有可能的 LCS(Xi,Yj)例:令X=a,b,c,f,b,c, Y=a,b,f,c,a,b LCS Y a b f c a bj i 0 1 2 3 4 5 6X 0 0 0 0 0 0 0 0a 1 0 1 1 1 1 1 1b 2 0 1 2 2 2 2 2c 3 0 1 2 2 3 3 3f 4 0 1 2 3 3 3 3b 5 0 1 2 3 3 3 4c 6 0 1 2 3 4 4 4|LCS(X,Y)| = 4(表格右下脚的值)反向推导,求出 LCS

6、(X,Y ) a,b,c,b/a,b,f,c整个求解过程就可以用填写一个最长公共子序列长度值的二维表来描述,表中第(i,j)处的值就是 Xi 与 Yj 的最长公共子序列长度值。填表的过程就是根据递推关系,从 1行 1 列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍求得最长公共子序列长度。二维表需要的存储空间为 O(m*n),在需要处理的字符串较长时,需要的空间比较大。注意到在填表过程中,填写第 i 行(列)时,前面 i-2 行(列)的数据不参与运算,为了节省存储空间,我们使用滚动数组:只保留当前填写的行(列)及前一行(列)的值,这样只需要两个一维数组即可,当前

7、行填写完毕,向后滚动。int main()char s11000,s21000; /输入两个字符串序列int r1000,s1000; /DP记录状态转移结果,采用滚动数组节省空间int l1,l2,i,j; /l1,l2记录两个字符串的长度while(scanf(“%s%s“,s1,s2)!=EOF)l1=strlen(s1);l2=strlen(s2);112ACM 程序设计培训教程for(i=0;isj?rj+1:sj;/如 果 序 列 对 应 字 符 不 同 ,取 大 的 那 一 个for(j=1;j=0;-i) /从后往前采用动态规划for(j=0;j8;+j) /j表示 8种结果for(k=0;k3;k+)xk=t(1k)j; /x表示 3种变化rj=x0;if(aix1airj)rj=x1;115第 6 章 动态规划if(aix2airj)rj=x2; /这 三 步 选 择 最 好 的 结 果for(k=0;k8;+k)tk=rk; /滚动数组printf(“%sn“,outcomer0);6.4 小 结动态规划是研究最优化问题的算法动态规划算法的有效性依赖于待求解问题本身具有的两个重要性质:最优子结构性质和子问题重叠性质。动态规划算法往往可以用递归解决,但动态规划具有更高的效率

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报