hdu 1159 Common Subsequence(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159
题意
找出两个字符串的最长公共子序列的长度。
题解
最长公共子序列模板题。
代码
#include <bits/stdc++.h> using namespace std; const int N = 1100; int dp[N][N]; string s1, s2; int LCS() { memset(dp, 0, sizeof dp); for (int i = 1; i <= s1.size(); i++) for (int j = 1; j <= s2.size(); 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]); return dp[s1.size()][s2.size()]; } int main() { while (cin >> s1 >> s2) cout << LCS() << "\n"; }
输出方案
#include <bits/stdc++.h> using namespace std; const int N = 1100; int dp[N][N]; string s1, s2; int x[N][N], y[N][N]; char ch[N][N]; int LCS() { for (int i = 1; i <= s1.size(); i++) for (int j = 1; j <= s2.size(); j++) if (s1[i - 1] == s2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; x[i][j] = i - 1; y[i][j] = j - 1; ch[i][j] = s1[i - 1]; } else { if (dp[i - 1][j] >= dp[i][j - 1]) { dp[i][j] = dp[i - 1][j]; x[i][j] = i - 1; y[i][j] = j; } else { dp[i][j] = dp[i][j - 1]; x[i][j] = i; y[i][j] = j - 1; } } return dp[s1.size()][s2.size()]; } void init() { memset(dp, 0, sizeof dp); memset(x, 0, sizeof x); memset(y, 0, sizeof y); memset(ch, 0, sizeof ch); } int main() { while (cin >> s1 >> s2) { init(); cout << LCS() << "\n"; int xx = s1.size(), yy = s2.size(); string ans; vector<int> s1_id, s2_id; while (xx or yy) { if (ch[xx][yy]) { ans += ch[xx][yy]; s1_id.push_back(xx); s2_id.push_back(yy); } int nx = x[xx][yy], ny = y[xx][yy]; xx = nx, yy = ny; } reverse(ans.begin(), ans.end()); reverse(s1_id.begin(), s1_id.end()); reverse(s2_id.begin(), s2_id.end()); for (int i = 0; i < s1_id.size(); i++) cout << s1_id[i] << " \n"[i == s1_id.size() - 1]; for (int i = 0; i < s2_id.size(); i++) cout << s2_id[i] << " \n"[i == s2_id.size() - 1]; cout << ans << "\n"; } }

浙公网安备 33010602011771号