POJ 2250(最长公共子序列 变形)

Description

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

The input 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

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

题意:  这个题目和书上的Lcs 问题差不多 但是他的元素不再是字符 变成了 每个元素都是单词也就是字符串方程:
LCS(i,j)表示数组以数组1的i个为止和以数组2的第j个为止的最长公共子序列,注意是第i个字符为子串的末尾字符(这样才能达到无后效性的目的)            1.LCS(i-1,j-1)+1 (a【i】=b【j】)LCS(i,j)={            2.max{LCS(i-1,j),LCS(i,j-1)} (a【i】!=b【j】)

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
using namespace std;

vector<string> st1,st2;
int dp[110][110],path[110][110];
int tag;

void printpath(int x,int y){
    if(x==0||y==0) return;
    if(path[x][y]==1){
        printpath(x-1, y-1);
        if(tag==0){
            cout<<st1[x-1];
            tag=1;
        }
        else cout<<" "<<st1[x-1];
    }
    else if(path[x][y]==2) printpath(x-1, y);
    else if(path[x][y]==3)printpath(x, y-1);
}

int main(){
    string str;
    while(cin>>str){
        st1.clear();st2.clear();
        st1.push_back(str);
        while(cin>>str&&str!="#") st1.push_back(str);
        while(cin>>str&&str!="#") st2.push_back(str);
        memset(dp,0,sizeof(dp));
        memset(path,0,sizeof(path));
        int len1=st1.size(),len2=st2.size();
        tag=0;
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
                    if(st1[i-1]==st2[j-1]){
                        dp[i][j]=dp[i-1][j-1]+1;
                        path[i][j]=1;
                    }else if(dp[i-1][j]>dp[i][j-1]){
                        dp[i][j]=dp[i-1][j];
                        path[i][j]=2;
                    }else{
                        dp[i][j]=dp[i][j-1];
                        path[i][j]=3;
                    }
              }
          }
        printpath(len1, len2);
        cout<<endl;
    }
return 0;
}

时间: 2024-12-08 02:13:28

POJ 2250(最长公共子序列 变形)的相关文章

Human Gene Functions POJ 1080 最长公共子序列变形

Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four letters, A, C, G, and T. Biologists have been interested in identifying human genes and determining their

poj之最长公共子序列

题目:poj 1458   Common Subsequence Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequenc

POJ 1458 最长公共子序列 LCS

经典的最长公共子序列问题. 状态转移方程为 : if(x[i] == Y[j]) dp[i, j] = dp[i - 1, j - 1] +1 else dp[i, j] = max(dp[i - 1], j, dp[i, j - 1]); 设有字符串X和字符串Y,dp[i, j]表示的是X的前i个字符与Y的前j个字符的最长公共子序列长度. 如果X[i] == Y[j] ,那么这个字符与之前的LCS 一定可以构成一个新的LCS: 如果X[i] != Y[j] ,则分别考察 dp[i  -1][j

poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53414   Accepted: 18449 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a

UVA 10723--Cyborg Genes+最长公共子序列变形

题目链接:点击进入 首先对于长度最短的情况是很容易确定的,只需要用两个字符串的长度和减去他们的最长公共子序列长度.然后比较麻烦的就是合乎要求的字符串的个数,其实我们也可以用类似于最长公共子序列的dp来求. 设dp[i][j]表示str1的前i个字符和str2的前j个字符所得到的满足要求的字符串,则如果str[i]==str[j],则dp[i][j]+=dp[i-1][j-1]; 否则就要根据i,j这两个位置上的最长公共子序列长度进行讨论,具体见代码. 代码如下: #include<iostrea

hdu1243(最长公共子序列变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1243 分析:dp[i][j]表示前i个子弹去炸前j个恐怖分子得到的最大分.其实就是最长公共子序列加每个字母值为1,这里每个字母代表的值变化了一下. 状态转移方程:if(s1[i-1]==s2[j-1])dp[nxt][j]=dp[cur][j-1]+val[s1[i-1]];                              else  dp[nxt][j]=max(dp[nxt][j-1]

51Nod 1092 回文字符串 | 最长公共子序列变形

求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #define maxn 1005 char s[maxn],s1[maxn]; int dp[maxn][maxn]; int main() { int n=0,i,j,len; scanf("%s",s); len=strlen(s); strcpy(s1,s); strrev(s1); f

POJ 1458 最长公共子序列

Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40210   Accepted: 16188 Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..

最长公共子序列变形

Yes, you are developing a 'Love calculator'. The software would be quite complex such that nobody could crack the exact behavior of the software. So, given two names your software will generate the percentage of their 'love' according to their names.