Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 6440 | Accepted: 2882 | Special Judge |
Description
Input
Output
Sample Input
die einkommen der landwirte
sind fuer die abgeordneten ein buch mit sieben siegeln
um dem abzuhelfen
muessen dringend alle subventionsgesetze verbessert werden
#
die steuern auf vermoegen und einkommen
sollten nach meinung der abgeordneten
nachdruecklich erhoben werden
dazu muessen die kontrollbefugnisse der finanzbehoerden
dringend verbessert werden
#
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden
题意 求两端文本的最长公共子单词序列 直接lcs增量法可以得出 打印路劲也是直接递归就行
#include<cstdio> #include<cstring> using namespace std; const int N = 105, L = 35; char a[N][L], b[N][L]; int pre[N][N], d[N][N], n, m, la, lb, flag; void lcs() { memset (d, 0, sizeof (d)); memset (pre, 0, sizeof (pre)); for (int i = 1; i < la; ++i) for (int j = 1; j < lb; ++j) if (!strcmp (a[i], b[j])) { d[i][j] = d[i - 1][j - 1] + 1; pre[i][j] = 1; } else if (d[i - 1][j] > d[i][j - 1]) { d[i][j] = d[i - 1][j]; pre[i][j] = 2; } else { d[i][j] = d[i][j - 1]; pre[i][j] = 3; } } void print (int i, int j) { if (pre[i][j] == 1) { print (i - 1, j - 1); if (flag) flag = 0; else printf (" "); printf ("%s", a[i]); } else if (pre[i][j] == 2) print (i - 1, j); else if (pre[i][j] == 3) print (i, j - 1); } int main() { while (scanf ("%s", a[1]) != EOF) { la = 1; lb = 0; flag = 1; while (scanf ("%s", a[++la]), a[la][0] != '#'); while (scanf ("%s", b[++lb]), b[lb][0] != '#'); lcs(); print (la - 1, lb - 1); printf ("\n"); } return 0; }
POJ 2250 Compromise (DP,最长公共子序列),布布扣,bubuko.com
POJ 2250 Compromise (DP,最长公共子序列)
原文地址:http://blog.csdn.net/iooden/article/details/38390619