uva 531(最长公共子序列)

来源:互联网 发布:ubuntu设置ip地址命令 编辑:程序博客网 时间:2024/05/21 22:25

题意:两个人写了一些单词,要求得出一个单词集,单词集是两个人写的单词序列中的最长公共子序列。

题解:敲上最长公共子序列的模板代码后,还要递归打印出这些单词。

#include <iostream>#include <string.h>#include <string>using namespace std;const int N = 105;string str1[N], str2[N], res[N];int f[N][N], n, n1, n2, path[N][N], flag;void sub_print(int a, int b) {if (a == 0 || b == 0)return;if (path[a][b] == 1) {sub_print(a - 1, b - 1);if (flag)cout << " ";flag = 1;cout << str1[a];}else if (path[a][b] == 2)sub_print(a - 1, b);elsesub_print(a, b - 1);}int main() {while (cin >> str1[1]) {flag = 0;n1 = 1;while (str1[n1] != "#")cin >> str1[++n1];cin >> str2[1];n2 = 1;while (str2[n2] != "#")cin >> str2[++n2];memset(f, 0, sizeof(f));n1--;n2--;for (int i = 1; i <= n1; i++)for (int j = 1; j <= n2; j++)if (str1[i] == str2[j]) {f[i][j] = f[i - 1][j - 1] + 1;path[i][j] = 1;}else {f[i][j] = f[i - 1][j] > f[i][j - 1] ? f[i - 1][j] : f[i][j - 1];if (f[i][j] == f[i - 1][j])path[i][j] = 2;elsepath[i][j] = 3;}sub_print(n1, n2);cout << endl;}return 0;}


0 0
原创粉丝点击