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, int y)
{
    if(!x || !y) return ;
    if(p[x][y] == 1) {
        print (x-1, y-1);
        if(f) printf(" ");
        else f = 1;
        cout << a[x];
    }
    else if(p[x][y] == 0) print (x-1, y);
    else print (x, y-1);
}
int main()
{
   // freopen("in.txt","r",stdin);
  // freopen("out.txt","w",stdout);
    while (cin >> a[1]) {
        int cnt = 2, cnt2 = 1;
        while (cin >> a[cnt] && a[cnt][0] != ‘#‘) cnt ++;
        while (cin >> b[cnt2] && b[cnt2][0] != ‘#‘) cnt2 ++;
        memset (d,0,sizeof(d));
        memset (p,0,sizeof(p));
        for (int i = 1; i < cnt; i ++) {
            for (int j = 1; j < cnt2; j ++) {
                if(a[i] == b[j]) {
                    d[i][j] = d[i-1][j-1] + 1;
                    p[i][j] = 1;
                }
                else if (d[i-1][j] >= d[i][j-1]) {
                    d[i][j] = d[i-1][j];
                    p[i][j] = 0;
                }
                else {
                    d[i][j] = d[i][j-1];
                    p[i][j] = -1;
                }
            }
        }
        f = 0;
        print (cnt-1, cnt2-1);
        printf ("\n");
    }
    return 0;
}
时间: 2024-12-18 14:16:12

UVA 531 LCS + 输出的相关文章

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-

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 872 - Ordering 输出全拓扑排序

本题要求输出全部拓扑排序的序列. 还好本题的数据量不是很大,限制在26个大写英文字母,故此可以使用递归法输出. 这个递归输出全部解在Leetcode很多这样的题目的,不小心的话,还是很难调试的. 总体考了递归和拓扑排序,还有判断是否可以拓扑排序-就是是否图有环. 考了三大知识点,难度还是有的.因为数据量不大,故此判断环可以使用一般递归方法,递归只需要注意细节就好了. #include <stdio.h> #include <vector> #include <string.h

hdu 1503 LCS输出路径【dp】

hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走.我用1表示向上走,2向左上方走,3向左走. 刚开始输入字符串时有两种方法,直接输入:或从地址后一位输入,即此时数组起始编号为1.直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS.两者在路径输出时有些差别,以前

uva 10635 LCS转LIS

这道题两个数组都没有重复的数字,用lcs的nlogn再适合不过了 #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #i

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

uva 10066 lcs 水题

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> #define INF 10000

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