题目链接:Advanced Fruits
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
char a[maxn], b[maxn];
typedef pair<int, int> PAIR;
int dp[maxn][maxn];
int main()
{
while (cin >> &a[1] >> &b[1])
{
vector<PAIR> res;
int len1 = strlen(&a[1]);
int len2 = strlen(&b[1]);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++)
{
if (a[i] == b[j])
dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
int len = dp[len1][len2];
int cnt = 0;
int i = len1, j = len2;
while (cnt != len)
{
if (a[i] == b[j])
{
res.push_back(PAIR{ i, j });
i--, j--, cnt++;
}
else if (dp[i][j] == dp[i - 1][j])
i--;
else j--;
}
int lasti, lastj;
int tempi, tempj;
lasti = lastj = 0;
for (int i = res.size() - 1; i >= 0; i--)
{
tempi = res[i].first, tempj = res[i].second;
for (int k = lasti + 1; k < tempi; k++)
cout << a[k];
for (int k = lastj + 1; k <= tempj; k++)
cout << b[k];
lasti = tempi, lastj = tempj;
}
printf("%s", &a[lasti + 1]);
printf("%s", &b[lastj + 1]);
cout << endl;
}
return 0;
}