题目传送门:https://www.luogu.org/problemnew/show/SP33

题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案)。数据组数$\leq 10$,字符串长度$\leq 80$,方案数$\leq 1000$


本来以为这是一道LCS水题,结果超级low的各种输出方案的方法TLE到怀疑人生

于是一个高大上的输出方法出现(借鉴于https://blog.csdn.net/gg_gogoing/article/details/41170117

多开两个辅助数组$f_{i,j}$与$g_{i,j}$代表$s1$与$s2$从第$1$个字符到第$i$个字符中字符$j$($a$对应$0$,$b$对应$1$,以此类推)最后一次出现的位置,计算完这两个数组之后,进行递归输出,同时使用枚举法,从后往前一个一个枚举当前位置可填的字母。
设$dfs( a , b , c)$表示当前$s1$的长度为$a$,$s2$的长度为$b$,待枚举的字母数量为$c$时的枚举过程,枚举$0-25$,得到该字母的$f_{a,b}$与$g_{a,b}$,如果当$s1$长度为$f_{a,b}$,$s2$长度为$g_{a,b}$时的最长公共子序列长度正好为$c$,则$dfs(f_{a,b} - 1 , g_{a,b} - 1 , c - 1)$,枚举完第一位后即得到一种满足题意的字符串

为何这样子可以大量剪枝?举例:

$abcabcaa$
$acbacba$

上面是样例数据,最长公共子序列长度为$5$。考虑$dfs(7,6,5)$时枚举到$a$(字符串从$0$开始标号),此时$f = 7 , g = 6$,会进行$dfs(6,5,4)$。如果不考虑上述枚举,我们的可选方案有$(0,0)(0,3)(0,6)(3,0)(3,3)(3,6)(6,0)(6,3)(6,6)(7,0)(7,3)(7,6)$共$12$种,因为相同的串算作同一方案,由贪心可以知道$(7,6)$是当前的最优选择,可以包含其他的所有情况,所以只需要向$(7,6)$继续搜索即可。

#include<bits/stdc++.h>
using namespace std;
string s1 , s2;
vector < string > s;
][] , last1[][] , last2[][] , cou;
//last1、last2对应上面的f、g。
inline int max(int a , int b){
    return a > b ? a : b;
}
void create(int a1 , int a2 , int num , string ss){
    ){
        s.push_back(ss);
        return;
    }
     ; i <  ; i++)
        if(last1[i][a1] >= num && last2[i][a2] >= num && maxN[last1[i][a1]][last2[i][a2]] == num)
            create(last1[i][a1] -  , last2[i][a2] -  , num -  , (char)('a' + i) + ss);
            //递归输出最重要的过程!!!
}
int main(){
    ios::sync_with_stdio();
    int T;
    for(cin >> T ; T ; T--){
        memset(maxN ,  , sizeof(maxN));
        memset(last1 ,  , sizeof(last1));
        memset(last2 ,  , sizeof(last2));
        cin >> s1 >> s2;
         ; i <= s1.size() ; i++)
             ; j <= s2.size() ; j++){
                ] == s2[j - ])    maxN[i][j] = max(maxN[i][j] , maxN[i - ][j - ] + );
                maxN[i][j] = max(maxN[i][j] , max(maxN[i - ][j] , maxN[i][j - ]));
            }
            //LCS DP求解
         ; i <= s1.size() ; i++)
             ; j <  ; j++)
                ] - 'a' == j)    last1[j][i] = i;
                ];
         ; i <= s2.size() ; i++)
             ; j <  ; j++)
                ] - 'a' == j)    last2[j][i] = i;
                ];
        create(s1.size() , s2.size() , maxN[s1.size()][s2.size()] , "");
        sort(s.begin() , s.end());
         ; i < s.size() ; i++)    cout << s[i] << endl;
        //输出
        s.clear();
        cout << endl;
        cou = ;
    }
    ;
}

SPOJ33&POJ1934 Trip LCS的更多相关文章

  1. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  2. poj1934 Trip【线性DP】【输出方案】

    Trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3850   Accepted: 1030 Description ...

  3. $Poj1934\ Trip$ 线性$DP+$搜索

    Luogu Description 爱丽丝和鲍伯想去度假,他们每个人都制定了一个参观城市的清单,该地区正好有26个城市,因此它们被编码为小写字母“a”到“z”.清单上可能重复出现某个城市.因为他们想一 ...

  4. POJ1934 Trip 题解

    LCS 模板,但要输出具体方案,这就很毒瘤了. 神奇的预处理:fa[i][j]表示在 \(a\) 串的前 \(i\) 个字符中,字母表第 \(j\) 个字母最晚出现的位置,fb[i][j]同理. 这样 ...

  5. [POJ1934] Trip

    问题描述 Alice and Bob want to go on holiday. Each of them has planned a route, which is a list of citie ...

  6. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  7. 题解 【POJ1934】 Trip

    题目意思: 有两个字符串(长度\(<=80\)),按字典序输出它们的最长公共子串的所有情况. 解析 最长公共子序列的长度应该都没问题了吧...有问题请自行百度 但关键是要求出每种情况,还要按字典 ...

  8. Trip

    Trip 给出一个长度为n序列\(\{a_i\}\),长度为m的序列\(\{b_i\}\),求它们的不同lcs序列按字典序输出,\(n,m\leq 80\),lcs不超过1000个,字符为26个小写字 ...

  9. 我的第一篇博客----LCS学习笔记

    LCS引论 在这篇博文中,博主要给大家讲一个算法----最长公共子序列(LCS)算法.我最初接触这个算法是在高中学信息学竞赛的时候.那时候花了好长时间理解这个算法.老师经常说,这种算法是母算法,即从这 ...

随机推荐

  1. 第三次web作业

    em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸,最初是指字母M的宽度,故名em.现指的是字符宽度的倍数,用法类似百分比,如:0 ...

  2. 《Inside C#》笔记(七) Attribute

    Attribute特性可以说是具有开创新的意义,因为一般的语言在被设计出来后,它所具有的能力就已经固定了.而借助Attribute特性,我们可以为C#已有的类型附加信息,既可以在编程时(design- ...

  3. 【Java入门提高篇】Day32 Java容器类详解(十四)ArrayDeque详解

    今天来介绍一个不太常见也不太常用的类——ArrayDeque,这是一个很不错的容器类,如果对它还不了解的话,那么就好好看看这篇文章吧. 看完本篇,你将会了解到: 1.ArrayDeque是什么? 2. ...

  4. [20170705]理解linux su命令.txt

    [20170705]理解linux su命令.txt --//我一般在维护时经常使用root用户登录,然后su - oracle 转到其他用户操作--//一般都加入 - 参数.这个已经成了条件反射.. ...

  5. 第三章 Hyper-V 2012 R2配置选项

    原书中的第二章 是介绍了下hyper-v的管理器和检查点的使用,导入导出虚拟机,所以我跳过了不高兴写,很简单.直接进入第三部分,介绍虚拟机的三个重要组成部分:CPU,内存,硬盘的配置选项. Hyper ...

  6. 解决pycharm下代码报错的问题

    file-----settings------project:Pythonstudy------project structure-----选择要导入的文件并点击OK

  7. Nginx禁止目录执行php文件权限

    location ~ /dir/.*.(php|php5)?$ { deny all; } 禁止dir目录执行php文件权限 .csharpcode, .csharpcode pre { font-s ...

  8. vue_表单控件

    Vue.js中提供 v-model 的指令对表单元素进行双向数据绑定,在修改表单元素值的同时,实例 vm 中对应的属性值也同时更新,反之亦然.本小节介绍主要input元素绑定v-model 后的具体用 ...

  9. 在linux系统下安装配置apacheserver

          我所用的是centos linux系统,但apache的服务在linux系统都大同小异.像ubuntu  redhat等等. now let us go!  如有问题, 欢迎直邮: zhe ...

  10. Spark远程调试参数

    Spark远程调试脚本: #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="- ...