Advanced Fruits
题意
找出这两个串的最长公共子序列,然后加上这两个串中减去公共子序列的字符。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <bitset>
using namespace std;
#define ll long long
//a,b 两种水果名,c 拼接的新水果
char a[200], b[200], c[400];
//最长公共子序列
int dp[200][200];
int main() {
while (scanf("%s%s", a + 1, b + 1) != EOF) {
memset(c, 0, sizeof(c));
memset(dp, 0, sizeof(dp));
int la = strlen(a + 1);
int lb = strlen(b + 1);
for (int i = 1; i <= la; i++) {
for (int j = 1; j <= lb; j++) {
if (a[i] != b[j]) {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
} else {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
}
}
int lc = 0;
while (true) {
if (a[la] == b[lb]) {
c[++lc] = a[la];
la--, lb--;
} else if (dp[la - 1][lb] > dp[la][lb - 1]) {
c[++lc] = a[la];
la--;
} else {
c[++lc] = b[lb];
lb--;
}
if (la == 0) {
for (int i = lb; i >= 1; i--) {
c[++lc] = b[i];
}
break;
}
if (lb == 0) {
for (int j = la; j >= 1; j--) {
c[++lc] = a[j];
}
break;
}
}
for (int i = lc; i >= 1; i--) {
printf("%c", c[i]);
}
printf("\n");
}
return 0;
}