POJ2250 Compromise(dp)

来源:互联网 发布:xp仿苹果mac界面主题 编辑:程序博客网 时间:2024/03/29 00:15

题目链接:点击打开链接


给出两段字符串数组, 每段以"#"结尾,  要求输出两段字符串数组最长的公共字符串.

lcs题目, 增加了一个flag数组保存字符串比较结果, 用于最后递归数据答案.


AC代码:

#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"using namespace std;const int MAXN = 105;char s1[MAXN][MAXN], s2[MAXN][MAXN];int dp[MAXN][MAXN], flag[MAXN][MAXN], len1, len2;void lcs(){for(int i = 1; i <= len1; ++i)for(int j = 1; j <= len2; ++j) {if(strcmp(s1[i - 1], s2[j - 1]) == 0) {dp[i][j] = dp[i - 1][j - 1] + 1;flag[i][j] = 1;}else {if(dp[i - 1][j] >= dp[i][j - 1]) {flag[i][j] = 2;dp[i][j] = dp[i - 1][j];}else {flag[i][j] = 3;dp[i][j] = dp[i][j - 1];}}}}void print(int x, int y){if(!x || !y) return;if(flag[x][y] == 1) {print(x - 1, y - 1);printf("%s ", s1[x - 1]);}else if(flag[x][y] == 2) print(x - 1, y);else print(x, y - 1);}int main(int argc, char const *argv[]){while(scanf("%s", s1[0]) != EOF) {for(len1 = 1; ; ++len1) {scanf("%s", s1[len1]);if(strcmp(s1[len1], "#") == 0) break;}for(len2 = 0; ; ++len2) {scanf("%s", s2[len2]);if(strcmp(s2[len2], "#") == 0) break;}lcs();print(len1, len2);printf("\n");}return 0;}


1 0
原创粉丝点击