Trip
2024-09-06 07:46:24
给出一个长度为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;
}
最新文章
- 当pageIndex遇上pageNo
- Linux下的C编程实战
- java语言实现堆排序
- iOS开发 - 网络数据安全加密(MD5)
- vb.net 动态调用api
- spring+jpg环境下,spring实现文件下载web实现通用的文件下载方法
- shell截取字符串方法
- 问题-Delphi编译到最后Linking时总是出现与ntdll.dll有关的错误还有Fatal Error Out of memory错误
- IO队列和IO调度
- 如何在Github Pages搭建自己写的页面?
- 关于 pthread_cond_wait 和 pthread_cond_signal , signal 无效的问题
- Ljava.lang.Object;@ba8a1dc
- Python--抽象类接口类
- PHP7 学习笔记(十二)PHPExcel vs PhpSpreadsheet and PHP_XLSXWriter
- MTCNN试用
- Luogu4528 CTSC2008 图腾 树状数组、容斥
- Java系列笔记(0) - 目录和概述
- 关于jquery所有动画都有速度和动画的方向(在宽度方向上的动画)?
- Ciel the Commander CodeForces - 321C (树, 思维)
- HDU 1233:还是畅通工程(最小生成树)
热门文章
- Java split的用法
- nuxt 项目启动报错(HTMLElement is not define nuxt.js)
- 前端 css 进阶
- vue之自定义指令
- Java&;Quartz实现任务调度
- hibernate(一对多关系)
- 在electron-vue项目中使用element-ui
- BZOJ 1415: [Noi2005]聪聪和可可(记忆化搜索+期望)
- 2019年12月12日英语学习-Will I Or Won&#39;t I ?
- NX二次开发-UFUN旋转视图UF_VIEW_rotate_view