UVa 531 - Compromise

题目:给你两个文章,求里面最多的按顺序出现的单词。

分析:dp,LCS(最大公共子序列)。直接求最大公共子序列,每个单词当做一个元素即可;

注意记录路径:如果匹配成功记录前驱,否则取前面取得的最大值的前驱(这里合成一个数字);

设状态f(i,j)为串S【0..i-1】与串T【0..j-1】的最大公共子序列。

有状态转移方程: f(i,j)= f(i-1,j-1)                                  {S【i-1】与T【j-1】相同}

f(i,j)= max(f(i-1,j),f(i,j-1)) {S【i-1】与T【j-1】不同}

说明:注意输出时的格式,多打个空格WA了好几次才发现。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

char word1[104][32];
char word2[104][32];
int  F[104][104],dp[104][104];

void output( int id, int flag )
{
	if ( id/1000 && id%1000 ) {
		output( F[id/1000-1][id%1000-1], 1 );
		printf("%s",word1[id/1000-1]);
		if ( flag ) printf(" ");
	}
}

int main()
{
	while ( cin >> word1[0] ) {
		int count1 = 1,count2 = 0;
		if ( strcmp(word1[0], "#") ) {
			while ( cin >> word1[count1] && strcmp( word1[count1], "#" ) )
				count1 ++;
		}else count1 = 0;

		while ( cin >> word2[count2] && strcmp( word2[count2], "#" ) )
			count2 ++;

		for ( int i = 0 ; i < 102 ; ++ i )
		for ( int j = 0 ; j < 102 ; ++ j ) {
			F[i][j] = 0; dp[i][j] = 0;
		}

		for ( int i = 1 ; i <= count1 ; ++ i )
		for ( int j = 1 ; j <= count2 ; ++ j )
			if ( !strcmp( word1[i-1], word2[j-1] ) ) {
				dp[i][j] = dp[i-1][j-1]+1;
				F[i][j] = 1000*i+j;
            }else if ( dp[i-1][j] < dp[i][j-1] ) {
                dp[i][j] = dp[i][j-1];
                F[i][j] = F[i][j-1];
            }else {
				dp[i][j] = dp[i-1][j];
                F[i][j] = F[i-1][j];
            }

		if ( F[count1][count2] )
			output( F[count1][count2], 0 );
		printf("\n");
	}
	return 0;
}

UVa 531 - Compromise

时间: 2024-11-05 13:40:49

UVa 531 - Compromise的相关文章

uva 531&#183;Compromise(LCS---路径打印)

题目: 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

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

Compromise 题目: 题目大意: 这里有两篇短文,每篇短文有若干个单词,求这两篇短文中的最长公共子序列,并将其输出来! 没篇短文输入 为 "#" 时,结束该篇短文的输入. 这道题是多组测试数据,如果只写一组,那么就会 WA,我因为这就被 WA 了一次! 最长公共子序列的解法,就不多说了,基本上所有的算法书上都有介绍讲解. 这道题,题意和解法我认为都不是难点,我个人认为难点是在最长公共子序列的保存记录上. 对于最长公共子序列的记录保存上,我用了 C++ 的 STL 中的strin

POJ 2250 Compromise (UVA 531)

LCS问题,基础DP. 让我很忧伤的WA了很多次.只是一个LCS问题,需要记录一下路径. 自己的想办法记录path出错,最后只好用标记. 没有什么优化,二维数组,递归打印,cin.eof() 来识别 end of file 标识. 至于单词用map 映射的.其实也用不着,直接二维string或者 二维char 然后strcmp 也行. Special Judge 交 UVA 531 奇怪的PE了... 然后改成 flag 标记 输出 空格.终于都AC了. #include<cstdio> #i

UVA 531 LCS + 输出

题意: 求最长公共子序列并输出序列. 解题: 处理一下输入,把单词存起来比较, 然后递归输出路径~ #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn = 110; const int INF = 0x3f3f3f3f; string a[maxn], b[maxn]; int d[maxn][maxn], p[maxn][maxn], f = 0; void print(int x

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

dp题目列表

10271 - Chopsticks 10739 - String to Palindrome 10453 - Make Palindrome 10401 - Injured Queen Problem 825 - Walking on the Safe Side 10617 - Again Palindrome 10201 - Adventures in Moving - Part IV 11258 - String Partition 10564 - Paths through the Ho

uva531Compromise (最长公共子序列+路径输出)

Compromise Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 531 Appoint description: Description Download as PDF In a few months the European Currency Union will become a reality. However, to join the club, th

LCS最长公共子串(复习复习)- -

详细解析LCS:传送通道 重点: 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略 解决LCS问题,你要求三个方面的东西:1.LCS(Xm-1,Yn-1)+1:2.LCS(Xm-1,Y),LCS(X,Yn-1):3.max{LCS(Xm-1,Y),LCS(X,Yn-1)}. show me the code: 1 Procedur

算法入门经典大赛 Dynamic Programming

111 - History Grading LCS 103 - Stacking Boxes 最多能叠多少个box DAG最长路 10405 - Longest Common Subsequence LCS 674 - Coin Change 全然背包求方案数 10003  - Cutting Sticks 区间DP dp[l][r]代表分割l到r的最小费用 116 - Unidirectional TSP 简单递推 输出字典序最小解 从后往前推 10131 - Is Bigger Smarte