Trip
给出一个长度为n序列\(\{a_i\}\),长度为m的序列\(\{b_i\}\),求它们的不同lcs序列按字典序输出,\(n,m\leq 80\),lcs不超过1000个,字符为26个小写字母。
解
注意,按照传统思路,递推+暴力方案转移+归并排序,时间复杂度\(O(80^3 \times 1000)=O(512000000)=O(5.12\times 10^8)\),必然会超时,而数据范围又很小,考虑dfs,并用递推的结果优化dfs。
为了让递推结果\(f[i][j]\)表示a序列前i长度,b序列前j长度的最长lcs能起作用,必然是从后往前搜,如果当前的状态能提供的lcs加上已经确定lcs不能为最优解的话,可以剪枝,另外,为了快速确定相同的字符,我们维护\(fa[i][j]\)表示a序列字符i的在\(1\sim j\)的最靠后的位置,fb同理,不难有
\]
于是维护出这两个东西,以此来dfs剪枝,就可以有很高的效率,不至于tle了。
参考代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#define il inline
#define ri register
using namespace std;
string a,b,ans[2050];
int dp[101][101],fa[101][101],
fb[101][101],tot,len;
il int max(int,int);
void dfs(int,int,string),work();
int main(){
int lsy;cin>>lsy;
while(lsy--)work(),putchar('\n');
return 0;
}
void work(){
cin>>a>>b,tot&=0;
for(int i(1),j;i<=a.size();++i)
for(j=1;j<=b.size();++j){
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
if(a[i-1]==b[j-1])dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]);
}
for(int i(1),j;i<=26;++i){
for(j=1;j<=a.size();++j)
if(a[j-1]==i+96)fa[i][j]=j;
else fa[i][j]=fa[i][j-1];
for(j=1;j<=b.size();++j)
if(b[j-1]==i+96)fb[i][j]=j;
else fb[i][j]=fb[i][j-1];
}len=dp[a.size()][b.size()];
dfs(a.size(),b.size(),""),sort(ans+1,ans+tot+1);
for(int i(1);i<=tot;++i)cout<<ans[i]<<endl;
}
void dfs(int a,int b,string s){
if(a<0||b<0)return;
if(s.size()==len)return(void)(ans[++tot]=s);
for(int i(1);i<=26;++i)
if(dp[fa[i][a]][fb[i][b]]+s.size()==len)
dfs(fa[i][a]-1,fb[i][b]-1,(char)(i+96)+s);
}
il int max(int a,int b){
return a>b?a:b;
}
Trip的更多相关文章
- Lesson 4 An existing trip
Text I have just received a letter from my brother,Tim. He is in Australia. He has been there for si ...
- dp or 贪心 --- hdu : Road Trip
Road Trip Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 29 ...
- 【poj1041】 John's trip
http://poj.org/problem?id=1041 (题目链接) 题意 给出一张无向图,求字典序最小欧拉回路. Solution 这鬼畜的输入是什么心态啊mdzz,这里用vector储存边, ...
- 1301. The Trip
A number of students are members of a club that travels annually to exotic locations. Their destinat ...
- 三分 --- POJ 3301 Texas Trip
Texas Trip Problem's Link: http://poj.org/problem?id=3301 Mean: 给定n(n <= 30)个点,求出包含这些点的面积最小的正方形 ...
- 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem C: The Trip(水题)
Problem C: The Trip Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 19 Solved: 3[Submit][Status][Web ...
- hdu 3018 Ant Trip 欧拉回路+并查集
Ant Trip Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- URAL 1004 Sightseeing Trip(最小环)
Sightseeing Trip Time limit: 0.5 secondMemory limit: 64 MB There is a travel agency in Adelton town ...
- Codeforces Round #365 (Div. 2) Mishka and trip
Mishka and trip 题意: 有n个城市,第i个城市与第i+1个城市相连,他们边的权值等于i的美丽度*i+1的美丽度,有k个首都城市,一个首都城市与每个城市都相连,求所有边的权值. 题解: ...
- hdu 2425 Hiking Trip
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2425 Hiking Trip Description Hiking in the mountains ...
随机推荐
- c# Winform 多线程操作
主要是对一个过程需要的时间很长执行时会出现界面假死的情况 方法1: Application.DoEvents(),这种方法当你拖动窗体时,界面不会假死.但在你拖动时代码不再执行,也就是阻塞了,当你不再 ...
- 兼容ie8浏览器的准备工作
一.html5shiv.js和respond.min.js html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min:让不支持css3 ...
- ARM 汇编 简单介绍
1. 汇编文件说明 : 汇编文件以 [.s]结尾的文件格式 注释:多行注释 /* */ : 单行注释 @ 2. 符号说明: 1) 汇编指令,一条指令对应一个机器码,完成一定的功能 2) 伪指令, ...
- 在Linux下如果要使用接口标志要加什么头文件吗?因为我在使用IFF_UP时会出错,说是未定义
头文件一般放在/usr/include目录下,用grep 'IFF_UP' /usr/include/*.* |less这个命令查找一下在哪个头文件里面有定义. 追问 嗯~这个方法确实可以查找到一 ...
- 引用opencv异常
1.异常AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d' 原因:**3.X以后OpenCv只包含部分内容,需要神经网络或者 ...
- R语言 基本语法
R语言基本语法 我们将开始学习R语言编程,首先编写一个"你好,世界! 的程序. 根据需要,您可以在R语言命令提示符处编程,也可以使用R语言脚本文件编写程序. 让我们逐个体验不同之处. 命令提 ...
- MetalLB自建私有Kubernetes的LoadBalancer负载均衡类型服务
简介 在私有网络上运行 Kubernetes,和御三家相比,对 LoadBalancer 类型的服务的支持应该是众多表面差异中最醒目的一个了.类型为 LoadBalancer 的服务在 Kuberne ...
- Kafka命令行操作
Kafka命令行操作 1)查看当前服务器中的所有topic [bingo@hadoop101 kafka]$ bin/kafka-topics.sh --list --zookeeper hadoop ...
- splay 模板 洛谷3369
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入 xx 数 删除 xx 数(若有多个相同的数,因只删除一个) 查询 xx 数的排名(排名定义为比当前数小的数 ...
- NX二次开发-获取当前part所在路径UF_PART_ask_part_name
#include <uf.h> #include <uf_ui.h> #include <uf_part.h> #include <atlstr.h> ...