题目大意:问你两个字符串的LCS,并输出最小字典序的LCS
解题思路:按照LCS的思路,找寻的时候并判断字典序即可
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
char s1[N], s2[N];
int len1, len2, cas = 1;
int dp[N][N];
char str[N][N][N];
void init() {
scanf("%s%s", s1 + 1, s2 + 1);
len1 = strlen(s1 + 1);
len2 = strlen(s2 + 1);
}
void solve() {
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++) {
if (s1[i] == s2[j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
for (int k = 0; k < dp[i - 1][j - 1]; k++)
str[i][j][k] = str[i - 1][j - 1][k];
str[i][j][dp[i - 1][j - 1]] = s1[i];
str[i][j][dp[i - 1][j - 1] + 1] = '\0';
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
if ((dp[i - 1][j] == dp[i][j - 1] && strcmp(str[i - 1][j], str[i][j - 1]) <= 0) || (dp[i - 1][j] > dp[i][j - 1])) {
for (int k = 0; k <= dp[i - 1][j]; k++)
str[i][j][k] = str[i - 1][j][k];
}
else {
for (int k = 0; k <= dp[i][j - 1]; k++)
str[i][j][k] = str[i][j - 1][k];
}
}
}
if (dp[len1][len2] == 0) printf("Case %d: :\(\n", cas++);
else printf("Case %d: %s\n", cas++, str[len1][len2]);
}
int main() {
int test;
scanf("%d", &test);
while (test--) {
init();
solve();
}
return 0;
}