poj2250——LCS记录路径

题目链接:http://poj.org/problem?id=2250

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

题目翻译

‎几个月后,欧洲货币联盟将成为现实。然而,要加入俱乐部,必须满足马斯特里赫特标准,这对各国来说并不是一件微不足道的任务(也许卢森堡除外)。为了强制要求德国达到标准,我们的政府有很多美妙的选择(提高税收,出售股票,重估黄金储备,...),以至于很难选择做什么。因此,德国政府需要一个计划,执行以下任务:‎
‎两名政治家各自输入他们的建议,即该做什么。 ‎
‎ ‎
‎然后,计算机输出两个建议中发生的最长的通用单词子序列。正如您所看到的,这是一个完全公平的妥协(毕竟,一个常见的词汇序列是两个人都想到的)。‎
‎你们国家需要这个程序,所以你的工作是为我们‎
‎写。‎

‎输入‎

‎输入将包含多个测试用例。‎
‎每个测试用例由两个文本组成。每个文本都以小写单词序列的形式给出,由空格分隔,但没有标点符号。单词的字数将少于 30 个字符。两个文本将包含少于 100 个单词,并将由包含单个"*"的行终止。‎
‎输入在文件末尾终止。‎

‎输出‎

‎对于每个测试用例,打印两个文本中出现的最长的常用单词子序列。如果有多个这样的序列,则任何一个序列都是可以接受的。将单词按一个空白分隔。在最后一个单词之后,输出一个换行符。‎

‎示例输入‎

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
#

‎样本输出‎

 

求出两个文本的最长公共单词,其实就是LCS输出路径。(妙用string数组,输入用坑)

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstring> 
using namespace std;
string s1[305],s2[305];
int dp[305][305],path[305][305]; 
int len1,len2;
void printpath(int x,int y){
//	if(path[x][y]==0) return ;
//	if(path[x][y]==1){
//		printpath(x-1,y-1);
//		cout<<s1[x]<<" ";
//	}
//	else if(path[x][y]==2){
//		printpath(x-1,y);
//	}
//	else{
//		printpath(x,y-1);
//	}
	if(x==0||y==0) return ;
	if(s1[x]==s2[y]){
		printpath(x-1,y-1);
		cout<<s1[x]<<" ";
	}
	else{
		if(dp[x-1][y]>dp[x][y-1]) printpath(x-1,y);
		else printpath(x,y-1); 
	}
}
int main(int argc, char** argv) {
	string str;
	while(cin>>str){
		len1=0;
		if(str!="#"){
			s1[++len1]=str;
			while(cin>>str&&str!="#"){
				s1[++len1]=str;
			} 
		}
		len2=0;
		while(cin>>str&&str!="#")
			s2[++len2]=str;
//		memset(path,0,sizeof(path));
		for(int i = 0;i<len1;++i) dp[i][0]=0;
		for(int i = 0;i<len2;++i) dp[0][i]=0;
		for(int i = 1;i<len1;++i){
			for(int j = 1;j<len2;++j){
				if(s1[i]==s2[j]){
					dp[i][j]=dp[i-1][j-1]+1;
//					path[i][j]=1;
				} 
				else{
					dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
//					if(dp[i-1][j]>dp[i][j-1]){
//						path[i][j]=2;
//					}
//					else{
//						path[i][j]=3;
//					}
				}
			} 
		}
		printpath(len1,len2);
		cout<<endl;
	}
	return 0;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值