当前位置: 首页 > news >正文

SP33 TRIP - Trip 个人题解

题目链接

题目大意:

给出两个字符串,要求求出所有 LCS (最长公共子序列问题)的具体方案,并按字典序输出

解题方法:

首先我们要清楚求 LCS 的长度的方法,按照闫氏DP分析法我们得到一下过程:

但是我们如果直接在此基础上进行 dfs 查找方案还是会超时,因为本质上是在枚举符合 LCS 长度每一种方案,我们可以用两个数组 \(fa[i][j]\)\(fb[i][j]\) 分别来处理字符串 \(a\) 与字符串 \(b\) 在讨论方案问题的位置,再进行 dfs 回溯查找。

数组 \(fa[i][j]\) 表示字符串 \(a\)\(i\) 个字符中字母 \(j+'a'\) 最近出现的位置,即:\(\begin{cases}if(a[i]==j+'a')&fa[i][j]=i;\\ else&fa[i][j]=fa[i-1][j];\end{cases}\)

同理,数组\(fb[i][j]\) 表示字符串 \(b\)\(i\) 个字符中字母 \(j+'a'\) 最近出现的位置,即:\(\begin{cases}if(a[i]==j+'a')&fb[i][j]=i;\\ else&fb[i][j]=fb[i-1][j];\end{cases}\)

然后我们看一下 dfs 求方案的状态,我们用 dfs(int x,int y,int k) 来表示在字符串 \(a\) 的前 \(x\) 个字符,字符串 \(b\) 的前 \(y\) 个字符找第 \(k\) 个字符的状态,我们发现当选择的字符一致时,越靠近第 \(x\) 个字符和第 \(y\) 个字符的位置越优,且可以包含后面同样时相同字符时的情况,所以我们在查找第 \(k\) 个字符时直接找距离第 \(x\) 个字符和第 \(y\) 个字符最近的字符 \(a\) 的位置即可,时间复杂度玄学,但能过(

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=101;
char a[N],b[N],ch[N];
int f[N][N],fa[N][26],fb[N][26];
vector<string> ans;
inline void dfs(int x,int y,int k){//求方案 if(!k){//如果全部查询完,将答案存放在ans里 string s=string(ch+1);ans.push_back(s);return; }for(int j=0;j<26;j++){//寻找最近的字符 int xa=fa[x][j],xb=fb[y][j];if(xa<k || xb<k || f[xa][xb]!=k) //如果超出范围调出 continue;ch[k]=j+'a';dfs(xa-1,xb-1,k-1);}
}
int T;
int main(){scanf("%d",&T);while(T--){memset(f,0,sizeof(0));memset(fa,0,sizeof(0));memset(fb,0,sizeof(0));//初始化数组 scanf("%s%s",a+1,b+1);int lena=strlen(a+1),lenb=strlen(b+1);//两个字符串长度 for(int i=1;i<=lena;i++){//计算字符串a中字母最近出现位置 for(int j=0;j<26;j++){if(a[i]==j+'a') fa[i][j]=i;else fa[i][j]=fa[i-1][j];	} }for(int i=1;i<=lenb;i++){//计算字符串b中字母最近出现位置 for(int j=0;j<26;j++){if(b[i]==j+'a') fb[i][j]=i;else fb[i][j]=fb[i-1][j];	} }for(int i=1;i<=lena;i++){//求LCS长度 for(int j=1;j<=lenb;j++){f[i][j]=max(f[i-1][j],f[i][j-1]);if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);}	}ans.clear();dfs(lena,lenb,f[lena][lenb]);//字符串a的长度,字符串b的长度,LCS长度 sort(ans.begin(),ans.end());//按照字典序输出,先排个序 for(int i=0;i<ans.size();i++)cout<<ans[i]<<endl;	}return 0;
} 
http://www.gsyq.cn/news/18394.html

相关文章:

  • 经营不是老板一个人的事 - 智慧园区
  • Codeforces Round 1051 (Div. 2)[A ~E]
  • 【Azure APIM】解答REST API实现禁用自签名证书的证书链验证中的backends参数值从那里取值的问题?
  • 2025 AI 进化图谱:技术突破、场景落地与产业重构 - 指南
  • 题解:P14065 [PO Final 2022] 对弈 / Laserschack
  • CF2064E Mycraft Sand Sort
  • 20251010周五日记
  • HTML5拖放API核心功能解析
  • Umi-OCR_文字识别工具 免安装使用教程(附下载安装包)!永久免费,开源离线OCR识别软件下载
  • 表格识别:不仅能识别文字,更能理解表格的结构和逻辑关系,实现输出可编辑、可分析的结构化数据
  • docker容器的三大核心技术UnionFS(下) - 指南
  • P13274 [NOI2025] 三目运算符
  • B2002 Hello,World!【入门】
  • 华为链路聚合配置
  • iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略 - 详解
  • 手机adb 调试自己
  • 2025 年公共/商场/学校/地铁/电影院/会所/机场/卫生间隔断厂家选购指南:优质厂商推荐与实用选择策略
  • Java环境安装备忘录
  • 详细介绍:标准型ELN成主流:定制型为何“遇冷”?
  • 【Linux】Ext系列文件系统(下) - 实践
  • 2025 年水产养殖降氨氮亚盐厂家最新推荐排行榜 ,助力北方对虾鱼塘螃蟹池塘养殖户轻松选购优质产品
  • 2025 年玻璃钢水箱生产厂家最新推荐榜单:含 30 吨 / 订做 / 消防 / 方形 / 拼装式 / 屋顶 / 大型产品,从产能与服务双维度精选优质企业
  • crontab 定时执行python脚本失败,但手动执行却成功问题处理 - hello-*
  • 2025 年不锈钢水箱厂家最新推荐榜:优质厂家实力对比与选购指南,助您选到适配设备矩形/屋顶/定做方形不锈钢水箱厂家推荐
  • 实用指南:Java 后端面试技术文档(参考)
  • 2025 年钢结构厂家最新推荐榜:优质企业全面解析,助力客户精准选择可靠合作伙伴
  • 2025规划馆运营厂家 TOP 榜:苏州金梓树智能科技,专注场馆全周期服务,规划馆运维优质服务商推荐!
  • 2025 高温线缆厂家 TOP 榜:奇温线缆 (上海) 有限公司,专注特种高温领域,定制化高温线缆源头厂家推荐!
  • OI 笑传 #17
  • 实用指南:Python Tkinter构建交互式精灵表切割桌面应用程序:将精灵表分割成单个帧的功能