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同理,不难有

\[fa[i][j]=\max(fa[i][j-1],j(a[j]==i+96))
\]

于是维护出这两个东西,以此来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的更多相关文章

  1. 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 ...

  2. dp or 贪心 --- hdu : Road Trip

    Road Trip Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 29 ...

  3. 【poj1041】 John's trip

    http://poj.org/problem?id=1041 (题目链接) 题意 给出一张无向图,求字典序最小欧拉回路. Solution 这鬼畜的输入是什么心态啊mdzz,这里用vector储存边, ...

  4. 1301. The Trip

    A number of students are members of a club that travels annually to exotic locations. Their destinat ...

  5. 三分 --- POJ 3301 Texas Trip

    Texas Trip Problem's Link:   http://poj.org/problem?id=3301 Mean: 给定n(n <= 30)个点,求出包含这些点的面积最小的正方形 ...

  6. 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem C: The Trip(水题)

    Problem C: The Trip Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 19  Solved: 3[Submit][Status][Web ...

  7. hdu 3018 Ant Trip 欧拉回路+并查集

    Ant Trip Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  8. URAL 1004 Sightseeing Trip(最小环)

    Sightseeing Trip Time limit: 0.5 secondMemory limit: 64 MB There is a travel agency in Adelton town ...

  9. Codeforces Round #365 (Div. 2) Mishka and trip

    Mishka and trip 题意: 有n个城市,第i个城市与第i+1个城市相连,他们边的权值等于i的美丽度*i+1的美丽度,有k个首都城市,一个首都城市与每个城市都相连,求所有边的权值. 题解: ...

  10. hdu 2425 Hiking Trip

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2425 Hiking Trip Description Hiking in the mountains ...

随机推荐

  1. MySQL将查询结果写入到文件的2种方法

    1.SELECT INTO OUTFIL: 这种方法不能覆盖或者追加到已经存在的文件,只能写入到新文件,并且建立文件的路径需要mysql进程用户有权限建立新文件. mysql 61571 60876 ...

  2. pcA降维 SVD

    前言: PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的.在上篇文章中便是基于特征值分解的一种解释.特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线 ...

  3. String,StringBuffer,StringBuilder

    String是字符串常量:StringBuffer,StringBuilder是字符串变量 StringBuffer是线程安全的且效率低:StringBuilder是线程不安全的故效率高 操作少量字符 ...

  4. 前端实现预览ppt,word,xls,pdf文件

    1.前端实现pdf文件在线预览功能 ps:刚好工作上有这个需求,所以到处找了一下处理方案,大家有需要可以试一下这几种方案,找到合适自己的 方式一. pdf文件理论上可以在浏览器直接打开预览但是需要打开 ...

  5. SLF4J log4j 不打印日志

      SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no ...

  6. 【NOI2019模拟2019.7.1】为了部落 (生成森林计数,动态规划)

    Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D ...

  7. PHP headers_sent() 函数

    定义和用法 headers_sent() 函数检查 HTTP 报头是否发送/已发送到何处. 如果报头已发送,该函数返回 TRUE,否则返回 FALSE. 语法 headers_sent(file,li ...

  8. 47 ubuntu指令整理学习

    0 引言 在使用ubutnu时,积累了大量命令笔记.但是这些笔记比较零散,没有系统性,不便于查找和使用.通过系统性.分门别类地整理,希望可以增强对指令的记忆,提高工作效率,对ubuntu的使用更加地道 ...

  9. NX二次开发-UFUN获取系统相关信息UF_ask_system_info

    NX9+VS2012 #include <uf.h> UF_initialize(); UF_system_info_t Info; UF_ask_system_info(&Inf ...

  10. LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)

    题目标签:Binary Search 题目给了我们一组 int array,让我们找到数组的 peak. 利用 binary search, 如果数字比它后面那个数字小,说明还在上坡,缩小范围到右半边 ...