- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最长公共子序列问题集-安阳一中.信息技术.doc
动态规划程序设计6
1、最长公共子序列问题
【问题描述】
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说.若给定序列X=x1,x2,…,xm,则另一序列Z=z1,z2,…,zk是X的子序列是指存在一个严格递增的下标序列i1,i2,…,ik,使得对于所有j=1,2,…,k有:
Xij=Zj
例如,序列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的子序列.从而确定它是否为x和Y的公共子序列.并且在检查过程中选出最长的公共子序列。x的所有子序列都检查过后即可求出x和Y的最长公共子序列,x的一个子序列相应于下标序列{1,2,…,m}的一个于序列.因此.x共有2m个不同子序列.从而穷举搜索法需要指数时间。
事实上,最长公共子序列问题也有最优子结构性质,因为我们有如下定理:
定理:LCS的最优子结构性质
设序列X=x1,x2,…,xm和Y=y1,y2,…,yn的一个最长公共子序列Z=z1,z2,…,zk.则:
若xm=yn则zk=xm=yn 且zk-1是xm-1和Yn-1最长公共子序列:
若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列;
若xm≠yn且zk≠yn,则Z是X和Yn-1的最长公共子序列。
其中xm-1=x1,x2,…,xm-1.Yn-1=y1,y2,…,yn-1.Zk-1=z1,z2,…,Zk-1。
证明:
用反证法。若zk≠Xm,则z1,z2,….zk,xm是x和Y的长度为k+1的公共子序列。这与z是X和Y的一个最长公共子序列矛盾,因此,必有Zk=xm=yn,由此可知zk-1是xm-1和Yn-1的一个长度为k-1的公共子序列。若xm-1和Yn-1有一个长度大于k-1的公共子序列W,则将xm加在其尾部将产生x和Y的一个长度大于k的公共子序列.此为矛盾。故Zk-1是xm-1和Yn-1的一个最长公共子序列。
由于zk≠xm,z是xm-1和Y的一个公共子序列:若xm-1和Y有一个长度大于k的公共子序列w,则w也是x和Y的一个长度大于k的公共子序列。这与z是x和Y的一个最长公共子序列矛盾。由此即知z是xm-1和Y的一个最长公共子序列。
这个定理告诉我们,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。
2.子问题重叠性质
由最长公共子序列问题的最优子结构性质可知.要找出x=xl,x2.…,xm和Y=y1,y2,…,yn的最长公共子序列.可按以下方式递归地进行:当xm=yn时.找出xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得x和Y的一个最长公共子序列。
当xm≠yn时,必须解两个子问题.即找出xm-1和Y的一个最长公共子序列及x和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为x和Y的一个最长公共子序列。由此递归结构容易看到最长公共子序列问题具有子问题重叠性质,例如.在计算X和Y的最长公共子序列时,可能要计算出x和Yn-1及xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题.即计算xm-1和Yn-1的最长公共子序列。
我们来建立子问题的最优值的递归关系。用c[i,j]记录序列xi和Yj的最长公共子序列的长度。其中xi=x1,x2,…,xi,Yj=y1,y2,…,yj。当i=0或j=0时,空序列是xi和Yj的最长
文档评论(0)