这是自动判题系统的描述
描述:
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有:
Xij = Zj
如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
求A、B所有公共子序列中最长的序列的长度。
输入:
输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
输出:
一个整数,表示最长各个子序列的长度。
格式:printf("%d/n");
输入样例:
programming
contest
输出样例:
2
代码:
但是这个程序只能计算出最长公共子序列的长度,那要是还想要知道是什么序列该怎么办呢?
这个算法可以解决刚才说的问题。
下面由我来进一步解释一下最长公共子序列问题的解法,当然,这不是我发明的,从书上学来的。
最长公共子序列问题具有最优子结构性质。
设序列X={x1,x2,...,xm},Y={y1,y2,...,yn}的最长公共子序列是Z={z1,z2,...zk},则
(1)如果xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列
(2)else if(zk不等于xm),则Z是Xm-1和Y的最长公共子序列
(3)else if(zk不等于yn),则Z是X和Yn-1的最长公共子序列
由此德奥递推公式
公共子序列,故此时c[i][j]=0 i=0 or j=0
当Xi=yi时,c[i][j]=c[i-1][j-1]+1;
else max{c[i][j-1],c[i-1][j]}
用数组b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的,在构造最长公共子序列时用到了。
在构造最长公共子序列时,首先从b[m][n]开始,依其值在数组b中搜索,当b[i][j]=1,表示Xi和Yj的最长公共子序列是由Xi-1和Yj-1的最长公共子序列尾部加上xi得到的序列。当b[i][j]=2时,表示Xi和Yj的最长公共子序列是由Xi-1和Yj的最长公共子序列相同,当b[i][j]=3时,表示Xi和Yj的最长公共子序列是由Xi和Yj-1的最长公共子序列相同,由此可找出最长公共子序列的具体内容。