备战蓝桥杯 Day9(最长公共子序列LCS模型)

news/发布时间2024/5/14 18:06:29

多序列dp

1265:【例9.9】最长公共子序列

【题目描述】

一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1,x2,…,xm>�=<�1,�2,…,��>,则另一序列Z=<z1,z2,…,zk>�=<�1,�2,…,��>是X的子序列是指存在一个严格递增的下标序列<i1,i2,…,ik><�1,�2,…,��>,使得对于所有j=1,2,…,k有:

  Xij=Zj���=��

例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>,则序列<B,C,A>是X和Y的一个公共子序列,序列 <B,C,B,A>也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列.因为X和Y没有长度大于4的公共子序列。

给定两个序列X=<x1,x2,…,xm>�=<�1,�2,…,��>和Y=<y1,y2….yn>�=<�1,�2….��>.要求找出X和Y的一个最长公共子序列。

【输入】

共有两行。每行为一个由大写字母构成的长度不超过1000的字符串,表示序列X和Y。

【输出】

第一行为一个非负整数。表示所求得的最长公共子序列的长度。若不存在公共子序列.则输出文件仅有一行输出一个整数0。

【输入样例】

ABCBDAB
BDCABA

【输出样例】

4

【提示】

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。字符串长度小于等于1000。

思路:
状态 dp[i][j] s1的前i个字符和s2的前j个字符构成的最长公共子序列的长度
状态转移方程:
    if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1;
    else dp[i][j]=max(dp[i][j-1],dp[i-1][j])

#include<iostream>
using namespace std;
#include <limits.h>
const int N=1e3+10;
int dp[N][N];
int main()
{string s1, s2; cin >> s1 >> s2;int n = s1.size(), m = s2.size();//先计算不加空格的长度s1 = ' '+s1; s2 = ' ' + s2;//边界 dp[i][0]=dp[0][j]=0;//不需置for (int i = 1; i <= n; i++){for (int j =1; j <=m; j++){if (s1[i] == s2[j])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = max(dp[i-1][j],dp[i][j-1]);}}cout << dp[n][m];return 0;}

 

1276:【例9.20】编辑距离

【题目描述】

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

1、删除一个字符;

2、插入一个字符;

3、将一个字符改为另一个字符。

对任意的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。

【输入】

第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

【输出】

只有一个正整数,为最少字符操作次数。

【输入样例】

sfdqxbw
gfdgw

【输出样例】

4

思路:
多序列dp-编辑距离Edit-Distance
1.状态  dp[i][j] s1的前i个字符变为s2的前j个字符所需的最小操作数(即最短编辑距离)
2.状态转移方程 
        if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]
        else dp[i][j]=min{dp[i-1][j]删除,dp[i][j-1]添加, dp[i - 1][j - 1]直接修改} + 1消耗一次操作数

#include<iostream>
using namespace std;
const int N = 2e3 + 10;
int dp[N][N];
int main() {//边界   dp[i][0]=i    dp[0][j]=jstring s1, s2;cin >> s1 >> s2;int n = s1.size(), m = s2.size();s1 = ' ' + s1;  s2 = ' ' + s2;//下标从1开始//边界for (int i = 1; i <= n; i++) dp[i][0] = i;for (int j = 1; j <= m; j++) dp[0][j] = j;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (s1[i] == s2[j]) dp[i][j] = dp[i - 1][j - 1];else dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}}cout << dp[n][m] << endl;return 0;
}

1286:怪盗基德的滑翔翼

【题目描述】

怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。

有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。

假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?

【输入】

输入数据第一行是一个整数K(K<100)�(�<100),代表有K�组测试数据。

每组测试数据包含两行:第一行是一个整数N(N<100)�(�<100),代表有N�幢建筑。第二行包含N�个不同的整数,每一个对应一幢建筑的高度h(0<h<10000)ℎ(0<ℎ<10000),按照建筑的排列顺序给出。

【输出】

对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。

【输入样例】

3
8
300 207 155 299 298 170 158 65
8
65 158 170 298 299 155 207 300
10
2 1 3 4 5 6 7 8 9 10

【输出样例】

6
6
9

思路:
状态 dp[i] 以第i个元素为结尾的最长上升子序列
状态转移方程:if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);

最后求最长上升子序列和最长下降子序列的最大值

#include<iostream>
using namespace std;
#include <limits.h>
const int N=1e4+10;
int dp_u[N],dp_d[N],a[N];
int main()
{int k; cin >> k;while (k--){int n; cin >> n;memset(dp_u,0,sizeof dp_u);memset(dp_d,0,sizeof dp_d);memset(a,0,sizeof a);for (int i = 1; i <= n; i++){cin >> a[i];//边界dp_u[i]=dp_d[i]= 1;}for (int i = n; i >=1; i--){for(int j=i+1;j<=n;j++)if (a[j] < a[i])dp_d[i] = max(dp_d[i], dp_d[j] + 1);}for (int i = 1; i <=n; i++){for(int j=1;j<i;j++)if (a[j] < a[i])dp_u[i] = max(dp_u[i], dp_u[j] + 1);}int mx = 1;for (int i = 1; i <= n; i++)mx = max(max(mx,dp_d[i]),dp_u[i]);cout << mx << endl;}return 0;}

 

1297:公共子序列

【题目描述】

我们称序列Z=<z1,z2,...,zk>�=<�1,�2,...,��>是序列X=<x1,x2,...,xm>�=<�1,�2,...,��>的子序列当且仅当存在严格上升的序列<i1,i2,...,ik><�1,�2,...,��>,使得对j=1,2,...,k,有xij=zj���=��。比如Z=<a,b,f,c> 是X=<a,b,c,f,b,c>的子序列。

现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。

【输入】

输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。

【输出】

对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。

【输入样例】

abcfbc abfcab
programming contest 
abcd mnp

【输出样例】

4
2
0
#include <limits.h>
#include<iostream>
using namespace std;
const int N=2e2+10;
int dp[N][N];
int main()
{string s1, s2;while (cin>>s1>>s2){memset(dp,0,sizeof dp);int n = s1.length(), m = s2.length();s1 = ' ' + s1; s2 = ' ' + s2;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (s1[i] == s2[j])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}cout << dp[n][m]<<endl;}return 0;}

 

1298:计算字符串距离

【题目描述】

对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:    

修改一个字符(如把“a”替换为“b”);

删除一个字符(如把“traveling”变为“travelng”)。

比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。

给定任意两个字符串,写出一个算法来计算出他们的距离。

【输入】

第一行有一个整数n。表示测试数据的组数。

接下来共n行,每行两个字符串,用空格隔开,表示要计算距离的两个字符串。

字符串长度不超过1000。

【输出】

针对每一组测试数据输出一个整数,值为两个字符串的距离。

【输入样例】

3
abcdefg  abcdef
ab ab
mnklj jlknm

【输出样例】

1
0
4
#include <limits.h>
#include<iostream>
using namespace std;
const int N=1e3+10;
int dp[N][N];
int main()
{int k; cin >> k;string s1, s2;while (k--){cin >> s1; cin >> s2;memset(dp,0,sizeof dp);int n = s1.length(), m = s2.length();s1 = ' ' + s1; s2 = ' ' + s2;for (int i = 1; i <= n; i++)dp[i][0] = i;for (int j = 1; j <= m; j++)dp[0][j] = j;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (s1[i] == s2[j])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]),dp[i-1][j-1])+1;}}cout << dp[n][m]<<endl;}return 0;}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/NwOO/3964.shtml

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

相关文章

MaxScale实现mysql8读写分离

MaxScale 实验环境 中间件192.168.150.24MaxScale 22.08.4主服务器192.168.150.21mysql 8.0.30从服务器192.168.150.22mysql 8.0.30从服务器192.168.150.23mysql 8.0.30 读写分离基于主从同步 1.先实现数据库主从同步 基于gtid的主从同步配置 主库配置 # tail -3 /etc/my.…

Android相机调用-libusbCamera【外接摄像头】【USB摄像头】 【多摄像头预览】

有的自定义系统&#xff0c;对于自己外接的USB摄像头&#xff0c;android原生的camera和camera2都无法打开&#xff0c;CameraX也用不了。这时候就要用libusbCamera&#xff0c;这个库可以打开摄像头&#xff0c;还可以多摄像头同时预览。本文主要是同时打开3个USB摄像头的项目…

可控核聚变新里程碑!AI成功预测等离子体撕裂登Nature,清洁能源「圣杯」更近一步

可控核聚变&#xff0c;又有新突破了&#xff01; 长期以来&#xff0c;核聚变一直受着一个「幽灵」的困扰——等离子体不稳定性问题。 而最近&#xff0c;普林斯顿团队用AI提前300毫秒预测了核聚变等离子不稳定态&#xff0c;这个时间&#xff0c;就足够约束磁场调整应对等离…

数组与指针相关

二级指针与指针数组 #include <stdio.h> #include <stdlib.h> int main() { // 定义一个指针数组&#xff0c;每个元素都是一个指向int的指针 int *ptr_array[3]; // 为指针数组的每个元素分配内存 ptr_array[0] malloc(2*sizeof(int)); ptr_array[1] m…

UML---活动图

活动图概述 活动图&#xff08;Activity Diagram&#xff09;是UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;中的一种行为建模工具&#xff0c;主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…

离散数学(一) 集合

属于关系 表示 枚举法&#xff1b; 叙述法&#xff1b; 文氏图法 基数 空集 全集 全集是相对唯一的 相等关系 有相同元素看作一个元素 包含关系 幂集 集合运算 并集 交集 补集 差集 对称差集 定理 可数集合与不可数集合 自然数集 等势 如果存在集合A到集合B的双射(又称一一…

vue实现递归组件

父组件&#xff1a; <Tree :data"data"></Tree> import Tree from "/components/Tree.vue"; const data reactive([{name: "1",checked: true,children: [{name: "1-1",checked: false,},],},&#xff09; 子组件&#…

H12-821_45

45.如图所示,同一局域网中的四台路由器运行IS-IS,其中R1是DIS.则R2、R3、R4分别和R1建立邻接关系,R2、R3、R4之间不建立邻接关系。 A.正确 B.错误 答案&#xff1a;B 注释&#xff1a; 在广播链路上IS-IS路由器建立邻接关系和OSPF不同&#xff0c;所有IS-IS路由器之间都可以建…

石头剪刀布游戏(C语言)

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目描述 石头剪刀布游戏有 3 种出拳形状&#xff1a;石头、剪刀、布。分别用字母 A , B , C 表示。 游…

视频基础学习二——图像深度与格式(RGB与YUV)

文章目录 前言一、图像深度1.什么是图像深度2.图像深度的意义3.常见的图像深度8位16位24位32位 二、图像格式1.RGB格式2.RGB样式2.YUVYUV的来由YUV样式RGB和YUV之间的转换YUV的常见类型 总结 前言 本文的目的是为了梳理音视频基础相关的知识&#xff0c;有很多做流媒体、音视频…

神经网络——循环神经网络(RNN)

神经网络——循环神经网络&#xff08;RNN&#xff09; 文章目录 神经网络——循环神经网络&#xff08;RNN&#xff09;一、循环神经网络&#xff08;RNN&#xff09;二、循环神经网络结构1、一对一&#xff08;One to One&#xff09;2、一对多&#xff08;One to Many&#…

稀疏计算、彩票假说、MoE、SparseGPT

稀疏计算可能是未来10年内最有潜力的深度学习方向之一&#xff0c;稀疏计算模拟了对人脑的观察&#xff0c;人脑在处理信息的时候只有少数神经元在活动&#xff0c;多数神经元是不工作的。而稀疏计算的基本思想是&#xff1a;在计算过程中&#xff0c;将一些不重要的参数设置为…

基于ssm的校园帮系统设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于ssm的校园帮系统设计…

axios是如何实现的(源码解析)

1 axios的实例与请求流程 在阅读源码之前&#xff0c;先大概了解一下axios实例的属性和请求整体流程&#xff0c;带着这些概念&#xff0c;阅读源码可以轻松不少&#xff01; 下图是axios实例属性的简图。 可以看到axios的实例上&#xff0c;其实主要就这三个东西&#xff1a…

npmjs官网(查询依赖包)

npmjs官网 可以方便的查看依赖包的安装、使用说明及相关注意事项等。 以wechat-http为例&#xff1a;

【黑马程序员】STL容器之string

string string 基本概念 string本质 string是c风格的字符串&#xff0c;而string本质上是一个类 string和char* 区别 char* 是一个指针string是一个类&#xff0c;类内部封装了char*,管理这个字符串&#xff0c;是一个char*型的容器 特点 string 内部封装了很多成员方法…

小程序--事件处理

一、事件对象 给小程序的事件传递参数&#xff0c;有以下两种方法&#xff1a; 1、自定义属性 <view class"item" wx:for"{{ 5 }}" wx:key"*this" data-index"{{index}}" bind:tap"onClick"></view> Page({o…

C#安装CommunityToolkit.Mvvm依赖

这里需要有一定C#基础&#xff0c; 首先找到右边的解决方案&#xff0c;右键依赖项 然后选择nuget管理 这里给大家扩展一下nuget的国内源&#xff08;https://nuget.cdn.azure.cn/v3/index.json&#xff09; 然后搜自己想要的依赖性&#xff0c;比如CommunityToolkit.Mvvm 再点…

vue中实现拖拽排序功能

npm i vuedraggable <template><div class"app-container"><!-- <div :class"canEdit ? dargBtn-lock el-icon-unlock : dargBtn-lock el-icon-lock" click"removeEvent()">{{ canEdit ? 调整 : 锁定 }}</div> --&…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…
推荐文章