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了。

参考代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <algorithm>
  5. #define il inline
  6. #define ri register
  7. using namespace std;
  8. string a,b,ans[2050];
  9. int dp[101][101],fa[101][101],
  10. fb[101][101],tot,len;
  11. il int max(int,int);
  12. void dfs(int,int,string),work();
  13. int main(){
  14. int lsy;cin>>lsy;
  15. while(lsy--)work(),putchar('\n');
  16. return 0;
  17. }
  18. void work(){
  19. cin>>a>>b,tot&=0;
  20. for(int i(1),j;i<=a.size();++i)
  21. for(j=1;j<=b.size();++j){
  22. dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
  23. if(a[i-1]==b[j-1])dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]);
  24. }
  25. for(int i(1),j;i<=26;++i){
  26. for(j=1;j<=a.size();++j)
  27. if(a[j-1]==i+96)fa[i][j]=j;
  28. else fa[i][j]=fa[i][j-1];
  29. for(j=1;j<=b.size();++j)
  30. if(b[j-1]==i+96)fb[i][j]=j;
  31. else fb[i][j]=fb[i][j-1];
  32. }len=dp[a.size()][b.size()];
  33. dfs(a.size(),b.size(),""),sort(ans+1,ans+tot+1);
  34. for(int i(1);i<=tot;++i)cout<<ans[i]<<endl;
  35. }
  36. void dfs(int a,int b,string s){
  37. if(a<0||b<0)return;
  38. if(s.size()==len)return(void)(ans[++tot]=s);
  39. for(int i(1);i<=26;++i)
  40. if(dp[fa[i][a]][fb[i][b]]+s.size()==len)
  41. dfs(fa[i][a]-1,fb[i][b]-1,(char)(i+96)+s);
  42. }
  43. il int max(int a,int b){
  44. return a>b?a:b;
  45. }

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创建新用户并且授权远程访问

    1 修改root用户的密码 linux安装了mysql后,默认情况下,如果是root用户,不需要密码就可以登陆. mysql -u root -p 然后回车就可以登陆了,如果是普通用户,不能登陆. 2 ...

  2. java-day02

    数据类型自动转换 要求:数据范围从小到大 数据类型强制类型转换 格式:范围小的数据类型 范围小的变量名 = (范围小的数据类型)原范围大的数据 注意事项: 1.可以会造成数据溢出或者是精度损失. 2. ...

  3. mac 常使用的一些小技巧

    全选 command +A 剪切 command + x 复制 ommand + c 粘贴 command + v 撤销 command + z 聚焦搜索 command + 空格 退出全屏窗口 Co ...

  4. CentOS 7 用 yum 安装 Nginx

    在 CentOS 7 中,直接使用 yum 安装 Nignx 会提示无下载源.因此,需要添加 Nginx 的下载源到 yum: sudo rpm -Uvh http://nginx.org/packa ...

  5. keepAlived常见问题

    1.脑裂问题 1.定义: 在一个高可用(HA)系统中,当关联着的两个结点互相之间断开通信时,本来为一个独立的对外提供服务的系统分裂为两个独立的结点,这时两个结点会争抢资源.(keepAlived 中表 ...

  6. ASP.NET MVC 解决账号重复登录问题

    解决重复登录 用到了 .net 身份票证 和Global全局处理文件 第一步 登录方法  传入用户名 private void GetOnline(string Name) { Hashtable S ...

  7. zmq作为守护进程?等待连接

    服务端是作为守护进程在运行的,客户端connect成功,但write时直接退出了,我在想肯能服务端socket在write时已经失效了,不然为什么会出现write时进程退出呢?现在的问题是,我要怎么才 ...

  8. 利用字节流文件生成包含多文件的zip文件

    InputStream[] inputStreamsList = new InputStream[jsonArr.size()]; String[] fileNameList = new String ...

  9. Batch - FOR /F Delims 和 Tokens 用法

    原文地址: for /f命令之—Delims和Tokens用法&总结 作者:别逗了好么 在For命令语踞饽参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总拮 ...

  10. delphi xe10 获取屏幕截图

    //截取屏幕图片 function MakeScaleScreenshot(Sender: TControl): TBitmap; function GetScreenScale: Single; v ...