- 18
- 0
- 约3.55千字
- 约 7页
- 2017-03-05 发布于重庆
- 举报
最长公共组序列
最长公共组序
班级:四班若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。请使用C语言编程,设计一个有效的算法解决下述问题:给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
设序列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)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。
(3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。
由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用c[i][j]记录序列和的最长公共子序列的长度。其中, Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时C[i][j]=#includeiostream
#includestring
using namespace std;
string x,y;//x,y用来存放字符序列
int **c,**b,m,n;
/*m,n分别存储字符串x,y的长度,数组c[i][j]存储Xi和Yj得最长公共子序列的长度,
b[i][j]记录c[i][j]的值是有哪一个子问题的解得到的*/
void LCSLength(int m,int n,string x,string y,int **c,int**b);
void LCS(int i,int j,string x,int **b);
void Initialize();//对数组b,c动态分配空间以及对其进行初始化
void ReadCommand(char cmd);
void Interpret(char cmd);
void Realese();//释放指针
void Display();
int main()
{
char cmd;
do
{
ReadCommand(cmd);
Interpret(cmd);
}while(cmd!=qcmd!=Q);
return 0;
}
void ReadCommand(char cmd)
{
system(cls); //清屏
cout\n--------------------------------------------------------------------------\n;
cout\n\t\t\t\t操 作 提 示;
cout\n--------------------------------------------------------------------------\n;
cout\tquit--q/Q \t\t continue---c/C\n;
do{
cout\n\n\t请选择操作:;
cincmd;
cout\n--------------------------------------------------------------------------\n;
}while(cmd!=ccmd!=Ccmd!=qcmd!=Q);
}
void Initialize()
{
cout分别输入两个字符串(每个字符串以回车结束)\n;
cinx;
ciny;
m=x.length();
n=y.length();
c=new int*[m+1];
b=new int*[m+1];
for(int i=0;i=m;i++)
{
c[i]=new int[n+1];
b[i]=new int[n+1];
}
}
void Realese()//释放指针board
{
for(int i=0;i=m;i++)
{
delete c[i];
delete b[i];
}
delete[] c;
delete[] b;
}
void Interpret(char cmd)
{
switch(cmd)
{
case c:
case C:
Initialize()
原创力文档

文档评论(0)