POJ 2250 & UVA 531 Compromise(字符串、 最长公共子序列)

Compromise

题目:

题目大意:

这里有两篇短文,每篇短文有若干个单词,求这两篇短文中的最长公共子序列,并将其输出来!

没篇短文输入 为 “#” 时,结束该篇短文的输入。

这道题是多组测试数据,如果只写一组,那么就会 WA,我因为这就被 WA 了一次!

最长公共子序列的解法,就不多说了,基本上所有的算法书上都有介绍讲解。

这道题,题意和解法我认为都不是难点,我个人认为难点是在最长公共子序列的保存记录上。

对于最长公共子序列的记录保存上,我用了 C++ 的 STL 中的string 来记录保存,string 的好处在于可以直接进行字符串的相加,因此就比较方便多了,对于输出数据的储存,我用了 vector 容器,这样读取的时候就比较方便,并且里面储存 string 类型的变量,对于后面的解答方便多了!

附上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;

int main()
{
	vector <string> str;
	vector <string> str1;
	string str2;
	int n = 0,m = 0;
	while(cin >> str2)             //  执行多组测试数据,这题是多组测试数据,写一组结果是错的
	{
		str.clear();
		str1.clear();
		n = 0;
		m = 0;
	if(str2 != "#")    //  判断第一篇文章的第一个输入的是不是 #  如果不是,继续输入,反之,输入第二篇文章的数据
	{
		n++;str.push_back(str2);
	        while(cin >> str2 && str2 != "#")
	        {
		        n++;str.push_back(str2);
	        }
	}
	while(cin >> str2 && str2 != "#")
	{
		m++;
		str1.push_back(str2);
	}

	int dp[110][110] = {0};
	string ans[110][110];           //   ans[i][j] 表示到达第一个到达 i 第二个到达 j 时的最长公共子序列
	vector <string> :: iterator it1;    //  定义迭代器
	vector <string> :: iterator it2;   //   同上
	int i = 0,j;
	for(it1 = str.begin();it1 != str.end();it1++,i++)     //  两层循环 , 动态规划 解决最长公共子序列问题
	{
		j = 0;
		for(it2 = str1.begin();it2 != str1.end();it2++,j++)
		{
			if(*it1 == *it2)                     //  如果单词相同  进行 加 操作
			{
				dp[i + 1][j + 1] = dp[i][j] + 1;
				string a;
				if(!ans[i][j].empty())
				a += ' ';              //  ans 不为空,那么说明不是第一个,那么与前一个单词之间需要有一个空格
				a += *it1;
				ans[i + 1][j + 1] = ans[i][j] + a;  // 将单词加上面
			}
			else                     //  不相同的时候进行选择,赋值
			{
				dp[i + 1][j + 1] = max(dp[i][j + 1],dp[i + 1][j]);
				ans[i + 1][j + 1] = dp[i][j + 1] > dp[i + 1][j] ? ans[i][j + 1] : ans[i + 1][j];
			}
		}
	}
	cout << ans[n][m] << endl;       输出结果
	}
	return 0;
}
时间: 2024-11-15 12:34:59

POJ 2250 & UVA 531 Compromise(字符串、 最长公共子序列)的相关文章

POJ 2250 Compromise (DP,最长公共子序列)

Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6440 Accepted: 2882 Special Judge Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfille

POJ 2250 Compromise(最长公共子序列)

题意:求两段文本的最长公共文本: 思路:最长公共子序列+打印公共序列: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[505][505],num1,num2; char s[505][505],s1[505][505],s2[505][505]; void lcs(int a,int b) { if(a==0||b==0) return; if(s[a

实习生面试--算法题之字符串最长公共子序列长度

题目:求两字符串的最长公共子序列的长度. 题外话:最长公共子串,子序列问题是被充分讨论的问题,网上一搜一大把,请bing之. 本题只要求求最长公共子序列的长度,而不需要记录最长的公共子序列,给予了我们便利,请参考代码: 1 int max(int a, int b) 2 { 3 return a > b ? a : b; 4 } 5 6 int lcs(char* str1, char* str2) 7 { 8 if (str1 == nullptr || str2 == nullptr) 9

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

字符串最长公共子序列问题

找两个字符串的最长公共子序列,最长公共子序列并不要求连续. 代码如下: package string; import java.util.ArrayList; import java.util.List; /** * 字符串的最长公共子序列问题 * @author Administrator * */ public class LCSequence { /** * 求最长公共子序列长度 * @param s1 * @param s2 * @return */ public int getMaxL

uva 10192 Vacation(最长公共子序列)

uva 10192 Vacation The Problem You are planning to take some rest and to go out on vacation, but you really don't know which cities you should visit. So, you ask your parents for help. Your mother says "My son, you MUST visit Paris, Madrid, Lisboa an

POJ - 1458 Common Subsequence (LCS最长公共子序列)

题意: 给出两个字符串,求出最长的公共子序列大小. 思路: 算是最经典的LCS问题吧. 设 \(X=(x_1,x_2,.....x_n) 和 Y=(y_1,y_2,.....y_m)\) 是两个序列,将 X 和 Y 的最长公共子序列记为\(lcs(X,Y)\) ,找出\(lcs(X,Y)\)就是一个最优问题 然后我们需要将其分解成子问题并求出子问题的最优解: (寻找子问题来推出当前问题,正是寻找状态转移方程最重要的一步) 1)如果 \(x_n=y_m\),即X的最后一个元素与Y的最后一个元素相同

poj 1080 ——Human Gene Functions——————【最长公共子序列变型题】

Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17805   Accepted: 9917 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

UVa 10192 Vacation (最长公共子序列)

Vacation Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description   The Problem You are planning to take some rest and to go out on vacation, but you really don't know which cities you should visit. So, you ask your paren