Xij = Zj
如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
求A、B所有公共子序列中最长的序列的长度,并给出此序列。
#include <stdio.h>
#include <stdlib.h>
int a[1000][10000],n1,n2;
char s1[1024],s2[1024],l[1024];
void fd(){
int i,j;
n1=strlen(s1);
n2=strlen(s2);
for(i=0;i<n1;i++){
for(j=0;j<n2;j++){
if(s1[i]==s2[j]){
a[i+1][j+1]=a[i][j]+1;
}
else
{
if(a[i][j+1]>a[i+1][j])
a[i+1][j+1]=a[i][j+1];
else
a[i+1][j+1]=a[i+1][j];
}
}
}
}
void search(){
int m1,m2,k=0;
m1=n1-1;
m2=n2-1;
k=a[n1][n2]-1;
while(m1!=-1 && m2!=-1){
if(s1[m1]==s2[m2]){
l[k]=s1[m1];
m1--;
m2--;
k--;
}
else{
if(m1-1>0 && a[m1][m2+1]>=a[m1+1][m2]){
m1--;
}
else
m2--;
}
}
}
int main()
{
int i,j;
gets(s1);
gets(s2);
fd();
search();
printf("%d\n",a[n1][n2]);
for(i=0;i<a[n1][n2];i++)
printf("%c",l[i]);
return 0;
}