#include <bits/stdc++.h>
using namespace std;
int LCS(char *s, char *ss, int n, int m, int **d) {
for(int i = 0; i <= n; i++) d[i][0] = 0;
for(int j = 0; j <= m; j++) d[0][j] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(s[i] == ss[j]) d[i][j] = d[i-1][j-1] + 1;
else d[i][j] = max(d[i-1][j], d[i][j-1]);
}
}
return d[n][m];
}
void print_LCS(char *s, int n,int m ,int **d) {
string lcs;
int i = n, j = m;
while(i > 0 && j > 0) {
if(d[i][j] == d[i-1][j-1] + 1) {
lcs.push_back(s[i]);
i--, j--;
}
else if(d[i][j] == d[i-1][j]) {
i--;
}
else j--;
}
reverse(lcs.begin(), lcs.end());
cout << lcs << endl;
}
void print_d(int n, int m, int **d) {
printf("打印状态转移表格:\n");
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= m; j++) {
printf("%d ", d[i][j]);
}
printf("\n");
}
cout << endl;
}
int main()
{
// freopen("i.txt", "r", stdin);
const int maxn = 1e3 + 10;
int **d = new int*[maxn];
for(int i = 0; i < maxn ; i++) {
d[i] = new int[maxn];
}
char *s = new char[maxn];
char *ss = new char[maxn];
int n, m;
cin >> n >> m;
scanf("%s", s + 1);
scanf("%s", ss + 1);
cout << LCS(s, ss, n, m, d) << endl;
print_d(n,m,d);
print_LCS(s, n,m, d);
return 0;
}
算法作业——最长公共子序列 + 打印答案
最新推荐文章于 2021-05-10 15:40:55 发布