給定的兩個序列,求其中公共的子序列的最長的並輸出
子序列是這樣的序列,其在原序列中,並且每個元素在原來序列中是嚴格遞增的
公共子序列的定理:
X={x1,x2,x3,...,xm} Y={y1,y2,y3,...,yn}
Z={z1,z2,...,zk};爲X何Y的最長公共子序列
則:
(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的最長公共子序列
c[i][j]記錄Xi和Yj的最長公共子序列的長度
d[i][j]記錄操作
c[i][j]是通過從底向上的方式求解其值
注意程序中,若二維數組名作爲函數參數,則必須指明二維數組第二維的長度,這樣才能編譯通過
#include<iostream>
using namespace std;
void LCS(int i,int j,char *x,int b[][7])
{
if(i==0||j==0)
return ;
if(*(*(b+i)+j)==1)
{
LCS(i-1,j-1,x,b);
cout<<x[i];
}
else if(*(*(b+i)+j)==2)
LCS(i-1,j,x,b);
else
LCS(i,j-1,x,b);
}
int main(void)
{
char a[9]={'0','A','B','C','B','D','A','B'};
char b[8]={'0','B','D','C','A','B','A'};
int c[8][7]={0};
int d[8][7]={0};
int i,j;
int m=7,n=6;
for(i=1;i<=m;i++)c[i][0]=0;
for(i=1;i<=n;i++)c[0][i]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(a[i]==b[j])
{
c[i][j]=c[i-1][j-1]+1;
d[i][j]=1;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
d[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
d[i][j]=3;
}
}
for(i=0;i<8;i++)
{
for(j=0;j<7;j++)
cout<<c[i][j]<<"\t";
cout<<endl;
}
for(i=0;i<8;i++)
{
for(j=0;j<7;j++)
cout<<d[i][j]<<"\t";
cout<<endl;
}
LCS(7,6,a,d);
return 0;
}