您的位置:首页 > 其它

LightOJ - 1110 An Easy LCS(LCS)

2015-10-31 23:00 330 查看
题目大意:问你两个字符串的LCS,并输出最小字典序的LCS

解题思路:按照LCS的思路,找寻的时候并判断字典序即可

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;

char s1
, s2
;
int len1, len2, cas = 1;
int dp

;
char str

;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: