$Poj1934\ Trip$ 线性$DP+$搜索
Description
爱丽丝和鲍伯想去度假,他们每个人都制定了一个参观城市的清单,该地区正好有26个城市,因此它们被编码为小写字母“a”到“z”.清单上可能重复出现某个城市.因为他们想一起旅行,他们必须走同样的路线.他们不想增加城市或改变城市顺序,所以只能从名单上删除一些城市.他们想尽可能多地参观城市.请你将他们两人的清单合成一个清单.
Input
输入的第一行包含一个整数,表示测试用例数T(T<=10).每个测试用例有两行:第一行是爱丽丝的列表,第二行是鲍伯的列表.每个列表包含1到80个小写字母.
Output
输出所有符合条件的清单,数据保证至少有一种可能的次序,但不超过1000次,按字典序输出.每个测试用例后输出一个空行.
Sol
这题的重点才不是DP,是搜索鸭QwQ. So DP求LCS就不讲了
这里要记录所有长度为ans的序列并按照字典序输出
注意到n的范围较小(1,80),所以是可以用枚举+搜索的
怎么搜呢,用到两个辅助数组,a,b
a[i][j]表示在序列1的前1到j位中,(i+'a'-1)这个字母出现的最大下标
b[i][j]表示在序列2............(同上)
dfs中就只要记录(l1,l2,l,s)表示当前序列1的长度为l1,序列2的长度为l2,待枚举的字母数是l,已经有的字符串s(就是前面枚举的字母形成的字符串鸭)
由于我是字符串白纸,所以get了关于字符串的新技能!
strint s;
s="a";s=s+'b'; //s="ab"
s='c'+s; //s="cab"
觉得好方便QwQ
Code
调了半个小时就因为把1写成i了 5555
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define Rg register
#define il inline
#define db double
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int T,ls1,ls2,ct,a[][],b[][],f[][];
string s1,s2,d[];
il void init()
{
mem(f,);ct=;
go(i,,)
go(j,,ls1)
if(s1[j]==i+'a'-)a[i][j]=j;
else a[i][j]=a[i][j-];
go(i,,)
go(j,,ls2)
if(s2[j]==i+'a'-)b[i][j]=j;
else b[i][j]=b[i][j-];
}
il void dfs(int l1,int l2,int l,string s)
{
if(l==){d[++ct]=s;return;}
if(l1< || l2<)return;
go(i,,)
{
int t1=a[i][l1],t2=b[i][l2];
if(f[t1][t2]==l){dfs(t1-,t2-,l-,char(i+'a'-)+s);}
} }
int main()
{
T=read();//remember to init ! ! !
while(T--)
{
cin>>s1>>s2;
ls1=s1.length();ls2=s2.length();
yes(i,ls1,)s1[i]=s1[i-];
yes(i,ls2,)s2[i]=s2[i-];
init();
go(i,,ls1)
go(j,,ls2)
if(s1[i]==s2[j])f[i][j]=f[i-][j-]+;
else f[i][j]=max(f[i-][j],f[i][j-]);
dfs(ls1,ls2,f[ls1][ls2],"");
sort(d+,d+ct+);
go(i,,ct)cout<<d[i]<<endl;
}
return ;
}
随机推荐
- 《C语言深度解剖》学习笔记之函数
第6章 函数 1.编码风格 [规则6-1]每一个函数都必须有注释 [规则6-2]每个函数定义之后以及每个文件结束之后都要加若干个空行 [规则6-3]在一个函数体内,变量定义与函数语句之间要加空行 [规 ...
- OpenStack组件系列☞Keystone搭建
一:版本信息 官网:http://docs.openstack.org/newton/install-guide-rdo/keystone.html 二:部署keystone 官网文档:http:// ...
- iptables 详细使用
检查状态 先检查是否安装了iptables $ service iptables status 安装iptables $ yum install iptables 升级iptables $ yum u ...
- apply、call、bind方法调用
---恢复内容开始--- 首先这三个方法的作用都是用来改变this的值,而this的值一般有几种情况. 1.函数作为一个对象的一个方法来调用,此时this的值指向对象. var a={ v:0; f: ...
- supersocket为动态命令增加命令过滤器
由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行 ...
- [C++] 自动关闭右下角弹窗
最近腾讯.迅雷等各种客户端,都越发喜欢在屏幕的右下角弹框了. 有骨气的人当然可以把这些软件卸载了事,但是这些客户端在某些情况下却又还是有用的.怎么办呢? 作为码农,自己实现一个自动关闭右下角弹窗的程序 ...
- Springboot 自定义多个404页面
在Springboot中,可以通过修改配置.或者在static文件夹下添加error文件夹引入个性化的404模版.但是如果需要针对不同url地址规则,返回不同样式的404页面,则难以实现了.针对这个问 ...
- jps简介
java虚拟机进程状态工具-jps 功能简介 列出指定机器上的虚拟机的进程状态 命令格式 jps [ options ] [ hostid ] 其中options选项可有 选项 作用描述 -q 只输出 ...
- php检测函数
验证字符串是否为电子邮箱 var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)); //bob@example.co ...
- 无限调用函数add(1)(2)(3)......
无限调用函数,并且累计结果 其实这也算一道面试题吧,笔者曾经被提问过,可惜当时没能答上来...