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

题意:

传送门

刚开始我是这么设状态的(谁叫我DP没学好)

\(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定没什么用。

还不如当时初学者的时候的\(dp(i,j)\)表示考虑到\(i\)考虑到\(j\)的LCS...果然经典的是禁得起考验的...

考虑如何记录方案,第一个想法是直接暴力记录从哪转移的,但是这样显然不行。因为有很多重复的元素。

注意到题目保证本质不同的满足答案要求的串的个数是\(O(n)\)级别的,而且字符集也是\(O(n)\)级别的,所以我们考虑一下对于每个串的每一个点的任意一个字符的最近的上一次出现的位置。我们只考虑对于每个字符每个上一次出现的不同位置,就类似于线性筛一样的使得我们对于每个不同的可以记录答案的串只记录了一次。

这样回溯的实质其实就是在从字符串的后端往前端枚举出现哪个字符,由于每次合法的"枚举"一定可以对应上一个不同的可以计入答案的串,所以复杂度就是\(O(n)\)的,而不是\(O(26^{80})\)。

这样的手法应该有更普适的含义,在要输出所有合法方案而且保证所有合法方案的级别时,或许也可以用这个手法来解题。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} const int maxn=81;
int data1[maxn],data2[maxn],sz1,sz2;
int dp[maxn][maxn];
int lastx[maxn][27];
int lasty[maxn][27];
char dfn[maxn];
typedef const int& ct;
set < string > s;
typedef set < string > :: iterator it;
inline void qr(int* p,int& cnt){
cnt=0;
register char c=getchar();
while(c<'a'||c>'z') c=getchar();
while(c>='a'&&c<='z') p[++cnt]=c-'a'+1,c=getchar();
} void dfs(ct x,ct y,ct len){
if(!len){
s.insert(dfn);
return;
}
if(x<=0||y<=0)return;
for(register int t=1,t1,t2;t<=26;++t){
t1=lastx[x][t];
t2=lasty[y][t];
if(dp[t1][t2]==len){
dfn[len-1]=t+'a'-1;
dfs(t1-1,t2-1,len-1);
}
}
} int main(){ qr(data1,sz1);
qr(data2,sz2); for(register int t=1;t<=sz1;++t)
for(register int i=1;i<=sz2;++i){
if(data1[t]==data2[i])
dp[t][i]=dp[t-1][i-1]+1;
if(data1[t]!=data2[i])
dp[t][i]=max(dp[t-1][i],dp[t][i-1]);
} for(register int t=1;t<=sz1;++t){
for(register int i=1;i<=26;++i)
lastx[t][i]=lastx[t-1][i];
lastx[t][data1[t]]=t;
} for(register int t=1;t<=sz2;++t){
for(register int i=1;i<=26;++i)
lasty[t][i]=lasty[t-1][i];
lasty[t][data2[t]]=t;
} dfs(sz1,sz2,dp[sz1][sz2]);
for(it t=s.begin();t!=s.end();++t)
cout<<*t<<'\n';
return 0;
}

【题解】POJ1934 Trip (DP+记录方案)的更多相关文章

  1. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  2. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  3. 牛客网多校训练第三场 A - PACM Team(01背包变形 + 记录方案)

    链接: https://www.nowcoder.com/acm/contest/141/A 题意: 有n(1≤n≤36)个物品,每个物品有四种代价pi,ai,ci,mi,价值为gi(0≤pi,ai, ...

  4. POJ 1952 BUY LOW, BUY LOWER DP记录数据

    最长递减子序列.加记录有多少个最长递减子序列.然后须要去重. 最麻烦的就是去重了. 主要的思路就是:全面出现反复的值,然后还是同样长度的子序列.这里的DP记录的子序列是以当前值为结尾的时候,而且一定选 ...

  5. 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)

    ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...

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

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

  7. CF10D-LCIS题解--线性DP+打印方案

    题目链接: https://www.luogu.org/problemnew/show/CF10D 方法一 分析 \(LCS\)和\(LIS\)已经成烂大街的知识了,可是当这两个合并起来成为\(LCI ...

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

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

  9. POJ1934 Trip 题解

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

随机推荐

  1. 2016集训测试赛(二十四)Problem C: 棋盘控制

    Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...

  2. Jenkins配置MSBuild实现自动部署2(项目实践)

    继上一篇文章http://www.cnblogs.com/EasonJim/p/6077225.html,大致实现的思路,今天来记录一个真实项目实践. 一.新建项目 选择[构建一个自由风格的软件项目] ...

  3. 清理XCode无用的文件(转)

    目录如下,直接删除即可: 1.移除对旧设备的支持 影响:可重新生成:再连接旧设备调试时,会重新自动生成.我移除了4.3.2, 5.0, 5.1等版本的设备支持. 路径: [~/Library/Deve ...

  4. go语言学习之路六:接口详解

    Go语言没有类和继承的概念,但是接口的存在使得它可以实现很多面向对象的特性.接口定义了一些方法,但是这些方法不包含实现的代码.也就是说这些代码没有被实现(抽象的方法).同时接口里面也不包含变量. 看一 ...

  5. /etc/shadow 密码加密方法

    [root@mysql-master ~]# cat /etc/shadowroot:$6$spzQDWctb8Lmju0o$KoUz5Qwv1tWyVYfd5cuBw.TQVIaCvCX8ixGG9 ...

  6. Sublime3破解教程[转载]

    sublime text 3 这个IDE相信很多人认识,尤其是python的.相对pycharm ide而言,速度快.界面清爽等优点,下面就分享下各个版本的破解方法 用UltraEdit等编辑器打开s ...

  7. Hadoop实战: Linux报 tmp 磁盘存储不足

    Linux 权限真是一大堆呀.在Linux下进行试验,突然来了个tmp磁盘存储不足..... .. .. ..... ... . 然而.我却没有权限给tmp添加容量.......... .. . 仅仅 ...

  8. Hibernate4.3.6 Final+Spring3.0.5配置出错提示及解决方法

    1. Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used ...

  9. openssl之BIO系列之22---Cipher类型的BIO

    Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net , ...

  10. Android组件间通信库EventBus学习

    项目地址:   https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在 ...