任务:使用动态规划实现最长公共子序列问题。
任务描述:给定序列X、Y,当另一序列Z既是X的子序列又是Y的子序列,且对于其他任意公共子序列W,都有|W| ≤ |Z|,则称Z是X和Y的最长公共子序列,记为LCS(X,Y)。
输入:序列X、Y
输出:最长公共子序列的长度和其中包含的元素
#include<stdio.h>
#include<string.h>
int c[200][200];
int b[200][200];
char f[200];
int Max(int m,int n,int i,int j)
{
if(m > n)
{
b[i][j] = -1;
return m;
}
else
{
b[i][j] = 1;
return n;
}
}
void print(int i,int j,int s,char x[],char y[])
{
if(b[i][j] == 0)
{
f[s-1] = x[i-1];
i--;j--;s--;
print(i,j,s,x,y);
}
else if(b[i][j] == -1)
{
i--;
print(i,j,s,x,y);
}
else if(b[i][j] == 1)
{
j--;
print(i,j,s,x,y);
}
}
int LCS(char x[],char y[])
{
int i,j;
int x_len,y_len;
x_len = strlen(x);
y_len = strlen(y);
printf(" ");
for(i = 0;i < y_len;i++)
{
printf("%c ",y[i]);
}
printf("\n");
for(i = 1;i <= x_len;i++)
{
printf("%c ",x[i-1]);
for(j = 1;j <= y_len;j++)
{
if(x[i-1] == y[j-1])
{
c[i][j] = c[i-1][j-1] +1;
b[i][j] = 0;
printf("%d ",c[i][j]);
}
else
{
c[i][j] = Max(c[i-1][j],c[i][j-1],i,j);
printf("%d ",c[i][j]);
}
}
printf("\n");
}
//打印X和Y的LCS
printf("X和Y的LCS是:");
print(x_len,y_len,c[x_len][y_len],x,y);
printf("%s",f);
printf("\n");
return c[x_len][y_len];
}
int main()
{
char X[200],Y[200];
int i,j,s;
printf("请输入字符串X:");
scanf("%s",X);
printf("请输入字符串Y:");
scanf("%s",Y);
s = LCS(X,Y);
printf("X和Y的LCS: %d \n",s);
}