SP33 TRIP - Trip 个人题解

news/2025/10/10 20:28:24/文章来源:https://www.cnblogs.com/bdxzay10180615/p/19133806

题目链接

题目大意:

给出两个字符串,要求求出所有 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.mzph.cn/news/934388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经营不是老板一个人的事 - 智慧园区

很多企业都陷入了“高层定目标,中层传口号,基层盲执行”的怪圈。一提到“经营”,大家就会想到董事长、总经理,觉得那是高层的事。但真相是:如果经营思维只停留在高层,企业正在走向危险边缘。一、经营到底是什么?…

Codeforces Round 1051 (Div. 2)[A ~E]

―僕は其れに縋る事さえ/出来無かった訳ですから目录Codeforces Round 1051 (Div. 2)A. All Lengths SubtractionB. DiscountsC. Max TreeD. Inversion Graph Coloring Easy Version/Hard VersionE. Make Good Codefo…

如何在 Spring Boot 应用中配置多个 Spring AI 的 LLM 客户端

1. 概述 越来越多的现代应用开始集成大型语言模型(LLM),以构建更智能的功能。如何使用Spring AI快速整合LLM能力到自己的Spring Boot应用,在之前的博文中有过很多篇关于使用Spring AI使用不同供应商LLM的整合案例。…

【Azure APIM】解答REST API实现禁用自签名证书的证书链验证中的backends参数值从那里取值的问题?

问题描述 使用APIM服务时候,因为后端的API需要使用自签名证书进行验证。如果通过浏览器直接访问后端API返回正常,但是APIM请求的时候返回为500报错。 在开启Trace后,发现报错信息为:error message :The underlyin…

2025 AI 进化图谱:技术突破、场景落地与产业重构 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:P14065 [PO Final 2022] 对弈 / Laserschack

题目传送门 先警示后人: 我在看题目的时候看成了 \(1 \le r,c \le 4000\) 然后被迫想了一个 \(\operatorname{O}(\operatorname{RC} \ \operatorname{log} \ \operatorname{RC})\) 发现好像有点玄 最后乱加一堆优化跑…

[Git] 放弃暂存区的修改

1 需求描述在使用 Git 进行版本控制时,有时我们会在暂存区(staging area)中暂存了一些修改,但后来发现这些修改是不需要的,想要放弃这些修改并恢复到上一次提交的状态。Git 提供了几种方法来实现这一操作。2 解决…

前端里面transform和transition 属性的区别

transform 和 transition 都是用于在 HTML 中控制元素的视觉效果和动画的 CSS 属性,但它们的作用和功能不同。下面详细解释这两个属性的区别: 1. transform 属性 transform 属性允许你对元素进行 2D 或 3D 转换(即对…

【MAC环境】安装多个 JDK - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF2064E Mycraft Sand Sort

Sol 首先 \(c\) 不能变,否则第一列就会改变。 然后注意到 \(i,j(i<j)\) 能交换当且仅当满足以下任意一条:\(\displaystyle\max_{k=i+1}^{j-1}a_k<\min(a_i,a_j)\) i+1=j那么考虑从小到大做,每次把小的数删除,…

使用eBPF技术保护FastAPI安全

本文详细介绍如何利用eBPF技术保护面向互联网的API安全,包括FastAPI、Flask、Django等框架。通过secimport工具实现Python代码的实时追踪、沙箱策略构建和运行时监控,有效防御远程代码执行等安全威胁。使用eBPF保护F…

项目案例作业2:对案例进行面向对象分析

学生管理系统面向对象分析报告 小组成员:李天瑞 202421336012 目录学生管理系统面向对象分析报告1. 案例中哪里体现出了封装性及其好处?封装性的体现封装性带来的好处2. 案例中的setter/getter模式与封装性什么是set…

20251010周五日记

20251010周五日记今天十点多回学校了,好不容易不下雨了。没想到国庆还真加了那么多天班= = 今日: 1.早上吃完早饭收拾东西慢慢悠悠回来了,打印朋辈表多亏师哥妙手回春。准备去开学代会,说来又要翘课了。 2.中午吃了…

k8s 主节点重启后 从节点 get 异常 - 教程

k8s 主节点重启后 从节点 get 异常 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

多维索引技术优化数据湖查询性能

本文介绍了一种通过多维索引技术优化数据湖查询性能的解决方案。该技术可直接集成到现有数据湖架构中,支持跨列复杂过滤,提升查询速度最高达6倍,同时降低70%计算成本,兼容主流计算引擎无需重构数据管道。Qbeast获7…

训练笔记:博弈杂题

[7-/7] A. 黎明\(1\sim n\) 排成一个环进行约瑟夫(隔一个删一个),求有多少个时刻,被删除的数的异或和为 \(0\)。 多测 \(10^5\) 组,\(n<10^{18}\)。hint:考虑把约瑟夫的过程分解为 \(\lceil\log n\rceil\) 个…

HTML5拖放API核心功能解析

好的,我们来详细解析一下 HTML5 拖放 API 的核心功能。 HTML5 拖放 API 允许用户在浏览器中抓取一个元素,并将其拖放到另一个位置。它原生支持在浏览器标签页、甚至不同浏览器、乃至桌面应用之间拖放,是现代 Web 应…

[USACO07NOV] Telephone Wire G

dp题,做法有点套路但是一开始没想到。 设 \(dp{_i}_j\) 表示第 \(i\) 位为 \(j\) 的最小花费。 然后直接往下转移就好了。点击查看代码 #include<bits/stdc++.h> #define fir first #define sec second #define…

springboot配置多个数据源

springboot配置多个数据源在我们的实际业务中可能会遇到;在一个项目里面读取多个数据库的数据来进行展示,spring对同时配置多个数据源是支持的。 使用到的框架:springboot+mybatis 方法:在配置文件中配置多个数据源…