LCS的模板题顺便加个路径打印
#include <bits/stdc++.h>
using namespace std;
#define ls st<<1
#define rs st<<1|1
#define fst first
#define snd second
#define MP make_pair
#define PB push_back
#define LL long long
#define PII pair<int,int>
#define VI vector<int>
#define CLR(a,b) memset(a, (b), sizeof(a))
#define ALL(x) x.begin(),x.end()
#define rep(i,s,e) for(int i=(s); i<=(e); i++)
#define tep(i,s,e) for(int i=(s); i>=(e); i--)
const int INF = 0x3f3f3f3f;
const int MAXN = 2e3+10;
const int mod = 1e9+7;
const double eps = 1e-8;
/*
状态转移方程为dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
*/
int dp[MAXN][MAXN];
int main(int argc, char const *argv[])
{
string a, b;
cin >> a >> b;
for(int i = 0; i < (int)a.size(); i++) {
for(int j = 0; j < (int)b.size(); j++) {
if(a[i] == b[j])
dp[i+1][j+1] = dp[i][j]+1;
else
dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j]);
}
}
int i = (int)a.size()-1;
int j = (int)b.size()-1;
string s;
while(i>=0 && j>=0) {
if(a[i] == b[j]) {
s += a[i];
i--; j--;
}
else if(dp[i][j+1]>dp[i+1][j])
i--;
else
j--;
}
reverse(s.begin(),s.end());
cout << s << endl;
return 0;
}