题意:
给定两个字符串序列,求最长公共子序列
思路:
方便起见,把字符串映射成两个数列,求最长公共子系列
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <string>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 100 + 7;
int a[maxn], b[maxn];
map<string, int> mp;
map<int, string> mpp;
string s;
int main() {
int id = 1;
int pos1 = 1, pos2 = 1;
while(cin >> s) {
mp[s] = id;
mpp[id] = s;
id++;
a[pos1++] = mp[s];
while(1) {
cin >> s;
if(s[0] == '#')
break;
if(mp[s])
a[pos1++] = mp[s];
else {
mp[s] = id;
mpp[id] = s;
id++;
a[pos1++] = mp[s];
}
}
while(1) {
cin >> s;
if(s[0] == '#')
break;
if(mp[s])
b[pos2++] = mp[s];
else {
mp[s] = id;
mpp[id] = s;
id++;
b[pos2++] = mp[s];
}
}
int dp[maxn][maxn] = {0};
int d[maxn][maxn] = {0};
for(int i = 1; i < pos1; ++i) {
for(int j = 1; j < pos2; ++j) {
if(a[i] == b[j]) {
dp[i][j] = max(dp[i-1][j-1]+1, max(dp[i][j-1], dp[i-1][j]));
} else
dp[i][j] = max(dp[i-1][j-1], max(dp[i-1][j], dp[i][j-1]));
}
}
int anss = dp[pos1-1][pos2-1];
stack<int> sk;
for(int i = pos1-1; i > 0; --i) {
for(int j = pos2-1; j > 0; --j) {
if(a[i] == b[j] && dp[i][j] == anss) {
anss--;
sk.push(a[i]);
}
}
}
while(!sk.empty()) {
int tt = sk.top();
cout << mpp[tt];
sk.pop();
if(sk.empty())
cout << endl;
else
cout << " ";
}
id = 1;
pos1 = 1;
pos2 = 1;
mp.clear();
}
return 0;
}