#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int max(int a, int b)
{
return a > b ? a : b;
}
void lcs(char *s1, char *s2, int m, int n)
{
int dp[MAX_LEN][MAX_LEN];
int i, j, k,s=0;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
if (s1[i-1] == s2[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
s+=1;
printf("%d ",dp[i][j]);
if(s%strlen(s2)==0) printf("\n");
}
}
printf("最长公共子序列长度为: %d\n", dp[m][n]);
char lcs[MAX_LEN];
k = dp[m][n];
i = m;
j = n;
while (k > 0)
{
if (s1[i-1] == s2[j-1])
{
lcs[k-1] = s1[i-1];
i--;
j--;
k--;
}
else if (dp[i-1][j] > dp[i][j-1])
{
i--;
}
else
{
j--;
}
}
printf("最长公共子序列为: %s\n", lcs);
}
int main()
{
char s1[MAX_LEN], s2[MAX_LEN];
int m, n;
printf("请输入第一个序列: ");
fgets(s1, MAX_LEN, stdin);
m = strlen(s1);
if (s1[m-1] == '\n')
s1[m-1] = '\0';
m--;
printf("请输入第二个序列: ");
fgets(s2, MAX_LEN, stdin);
n = strlen(s2);
if (s2[n-1] == '\n')
s2[n-1] = '\0';
n--;
lcs(s1, s2, m, n);
return 0;
}