欢迎来到天天文库
浏览记录
ID:28665519
大小:57.00 KB
页数:3页
时间:2018-12-12
《最长公共子序列问题集.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、安阳市一中信息学奥赛辅导资料动态规划程序设计61、最长公共子序列问题【问题描述】一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说.若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列,使得对于所有j=1,2,…,k有:Xij=Zj例如,序列z=是序列X=的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,
2、称z是序列x和Y的公共子序列。例如,若x=和Y=,则序列是X和Y的一个公共子序列,序列也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列.因为x和Y没有长度大于4的公共子序列。给定两个序列X=和Y=.要求找出X和Y的一个最长公共子序列。输入:输入文件共有两行.每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。输出:输出文件第一行为一个非负整数.表示所求得的
3、最长公共子序列的长度.若不存在公共子序列.则输出文件仅有一行输出一个整数0.否则在输出文件的第二行输出所求得的最长公共子序列(也用一个大写字母组成的字符串表示).若符合条件的最长公共子序列不止一个,只需输出其中任意的一个。【样例输入】LCS.INABCBDABBDCABA【样例输出】LCS.OUT4BCBA【问题分析】动态规划算法可有效地解此问题。下面我们按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法.1、最长公共子序列的结构解最长公共子序列问题时最容易想到的算法是穷举搜索法.即对x的每一个子序列.检查它是否
4、也是Y的子序列.从而确定它是否为x和Y的公共子序列.并且在检查过程中选出最长的公共子序列。x的所有子序列都检查过后即可求出x和Y的最长公共子序列,x的一个子序列相应于下标序列{1,2,…,m}的一个于序列.因此.x共有2m个不同子序列.从而穷举搜索法需要指数时间。事实上,最长公共子序列问题也有最优子结构性质,因为我们有如下定理:定理:LCS的最优子结构性质设序列X=和Y=的一个最长公共子序列Z=.则:若xm=yn则zk=xm=yn且zk-1是xm-1
5、和Yn-1最长公共子序列:若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列;若xm≠yn且zk≠yn,则Z是X和Yn-1的最长公共子序列。其中xm-1=.Yn-1=.Zk-1=。第3页共3页安阳市一中信息学奥赛辅导资料证明:用反证法。若zk≠Xm,则是x和Y的长度为k+1的公共子序列。这与z是X和Y的一个最长公共子序列矛盾,因此,必有Zk=xm=yn,由此可知zk-1是xm-1和Yn-1的一个长度
6、为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的一个最长公共子序列。这个定理告诉我们,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此,最长公共子序
7、列问题具有最优子结构性质。2.子问题重叠性质由最长公共子序列问题的最优子结构性质可知.要找出x=和Y=的最长公共子序列.可按以下方式递归地进行:当xm=yn时.找出xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得x和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题.即找出xm-1和Y的一个最长公共子序列及x和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为x和Y的一个最长公共子序列。由此递归结构容易看到最长公共子序列问题具有子问题重
8、叠性质,例如.在计算X和Y的最长公共子序列时,可能要计算出x和Yn-1及xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题.即计算xm-1和Yn-1的最长公共子序列。我们来建立子问题的最优值的递归关系。用c[i,j]记录序列xi和Yj的最长公共子序列的长度。其中xi=,Yj=
此文档下载收益归作者所有