/* LCS加强版,1次A掉了,nice...
* dp过程和LCS差不多,但是题目的难点在于打印路径
* 我的做法是先把最后的dp值求出来
* 然后按照类似于记忆化搜索的方法往回找路径
* 有个地方没想清楚就是,搜索过程中的顺序要和求dp过程的顺序恰好相反
* 代码如下:
*/
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
vector<int> ans;
char tmp[32];
int dp[120][120];
char str1[120][32], str2[120][32];
void dfs(int i, int j) {
if(i == 1) {
ans.push_back(1);
return ;
}
if(j == 1) {
ans.push_back(1);
return ;
}
if(dp[i][j] == dp[i-1][j]) {
dfs(i-1, j);
} else if(dp[i][j] == dp[i][j-1]) {
dfs(i, j-1);
} else if(dp[i][j] != dp[i-1][j-1]+1) {
dfs(i-1, j-1);
} else if(dp[i][j] == dp[i-1][j-1]+1) {
// printf("str1[%d] = %s\n", i-1, str1[i-1]);
// printf("str2[%d] = %s\n", j-1, str2[j-1]);
// cout << "----------" << endl << endl;
ans.push_back(i);
dfs(i-1, j-1);
}
}
int main(void) {
while(scanf("%s", str1[0]) != EOF) {
int len1 = 1;
while(scanf("%s", tmp) && strcmp(tmp, "#") )
strcpy(str1[len1++], tmp);
int len2 = 0;
while(scanf("%s", tmp) && strcmp(tmp, "#") )
strcpy(str2[len2++], tmp);
/*
for(int i=0; i<len2; ++i)
printf("%s ", str2[i]);
*/
memset(dp, 0, sizeof(dp));
for(int i=0; i<len1; ++i) {
for(int j=0; j<len2; ++j) {
if(strcmp(str1[i], str2[j]) == 0) {
dp[i+1][j+1] = dp[i][j]+1;
}
else dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]);
}
}
//printf("%d\n", dp[len1][len2]);
ans.clear();
dfs(len1, len2);
for(int i=ans.size()-1; i>0; --i) {
printf("%s ", str1[ans[i]-1]);
}
printf("%s\n", str1[ans[0]-1]);
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
}
return 0;
}
poj 2250 Compromise (DP:LCS加强版+记忆化搜索)
最新推荐文章于 2018-08-11 15:34:13 发布