uva 531 Compromise (最长公共子序列)
来源:互联网 发布:淘宝名字大全男生 编辑:程序博客网 时间:2024/06/05 12:03
uva 531 Compromise
In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfilled, and this is not a trivial task for the countries (maybe except for Luxembourg). To enforce that Germany will fulfill the criteria, our government has so many wonderful options (raise taxes, sell stocks, revalue the gold reserves,…) that it is really hard to choose what to do.
Therefore the German government requires a program for the following task:
Two politicians each enter their proposal of what to do. The computer then outputs the longest common subsequence of words that occurs in both proposals. As you can see, this is a totally fair compromise (after all, a common sequence of words is something what both people have in mind).
Your country needs this program, so your job is to write it for us.
Input Specification
The input file will contain several test cases.
Each test case consists of two texts. Each text is given as a sequence of lower-case words, separated by whitespace, but with no punctuation. Words will be less than 30 characters long. Both texts will contain less than 100 words and will be terminated by a line containing a single ‘#’.
Input is terminated by end of file.
Output Specification
For each test case, print the longest common subsequence of words occuring in the two texts. If there is more than one such sequence, any one is acceptable. Separate the words by one blank. After the last word, output a newline character.
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
题目大意:字符串版的最长公共子序列。
解题思路:要输出路径,所以难点在于记录,边DP边记录,最后从最后一个推回来。还有一个要注意的地方就是,它不止一个样例,读入数据的时候要注意。
#include <cstdio>#include<iostream>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>#include<map>#define N 35#define M 105using namespace std;char s1[M][N], s2[M][N];int dp[M][M], cnt1, cnt2, x[M][M], y[M][M], rec[M];void DP() { for (int i = 1; i <= cnt1; i++) { for (int j = 1; j <= cnt2; j++) { if (strcmp(s1[i - 1], s2[j - 1]) == 0) { dp[i][j] = dp[i - 1][j - 1] + 1; x[i][j] = i - 1; y[i][j] = j - 1; } else { if (dp[i - 1][j] > dp[i][j - 1]) { dp[i][j] = dp[i - 1][j]; x[i][j] = i - 1; y[i][j] = j; } else { dp[i][j] = dp[i][j - 1]; x[i][j] = i; y[i][j] = j - 1; } } } } int sum = dp[cnt1][cnt2] - 1, p = cnt1, q = cnt2; while (1) { if (x[p][q] == -1 || y[p][q] == -1) break; if (sum < 0) break; if ((p == x[p][q] + 1) && q == y[p][q] + 1) { rec[sum--] = x[p][q]; } int temp = p; p = x[temp][q], q = y[temp][q]; }}int main() { while (1) { int flag = 0; cnt1 = 0, cnt2 = 0; memset(dp, 0, sizeof(dp)); memset(rec, 0, sizeof(rec)); memset(x, 0, sizeof(x)); memset(y, 0, sizeof(y)); while (1) { if (scanf("%s", s1[cnt1++]) != 1) { flag = 1; break; } if (s1[cnt1 - 1][0] == '#') break; } while (1) { scanf("%s", s2[cnt2++]); if (s2[cnt2 - 1][0] == '#') break; } if (flag) break; cnt1--, cnt2--; DP(); for (int i = 0; i < dp[cnt1][cnt2] - 1; i++) { printf("%s ", s1[rec[i]]); } printf("%s\n", s1[rec[dp[cnt1][cnt2] - 1]]); } return 0;}
- UVA 531 Compromise 最长公共子序列(DP)
- UVa 531 Compromise (DP 最长公共子序列)
- uva 531 Compromise (最长公共子序列)
- POJ2250 & UVA 531 Compromise(字符串、 最长公共子序列)
- 【UVA】531-Compromise(最长公共子串)
- UVA Compromise(最长公共子序列 + 打印路径)
- uvaoj 531 Compromise 最长公共子序列求出子序列
- POJ 2250Compromise(DP最长子公共子序列)
- 【POJ2250】Compromise (最长公共子序列,DP)
- poj 2250 Compromise(LCS,最长公共子序列)
- POJ 2250 Compromise(最长公共子序列)
- poj_2250 Compromise(输出最长公共子序列)
- POJ2250 Compromise DP最长公共子序列
- poj 2250 Compromise(最长公共子序列)
- POJ 2250 Compromise(最长公共子序列 列出子序列)
- uva 531(最长公共子序列)
- POJ 2250 Compromise (DP,最长公共子序列)
- POJ 2250 Compromise (DP,最长公共子序列)
- 多益网络2015校园招聘面试题目大揭秘
- 返回参数二进制为1的个数
- 背包之01背包、完全背包、多重背包详解
- 九度OJ--1007-奥运排序问题
- 堆排序算法总结
- uva 531 Compromise (最长公共子序列)
- (4.4.4)android的组件类
- BZOJ 3620 似乎在梦中见过的样子 KMP+暴力
- hihoCoder 1043 完全背包
- HDU 4288 Coder(线段树单点更新)
- Visual Studio 学习笔记
- SNMP协议详解
- 2015年3月如何免费刷Q币方法有什麽软件可以刷Q币,不要钱刷QB软件
- Java NIO详解及实例和源码下载(二)