信息学奥赛初赛天天练-18-挑战程序阅读-最长公共子序列、字符串与数组越界的巧妙应用

PDF文档公众号回复关键字:20240601
在这里插入图片描述

1 2023 CSP-J 阅读程序2

阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)

源程序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int f(string x,string y){int m=x.size();int n=y.size();vector<vector<int>>v(m+1,vector<int>(n+1,0));for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(x[i-1]==y[j-1]){v[i][j]=v[i-1][j-1]+1;}else{v[i][j]=max(v[i-1][j],v[i][j-1]);}}}return v[m][n];
}bool g(string x,string y){if(x.size() != y.size()){return false;}return f(x+x,y)==y.size();
}int main(){string x,y;cin>>x>>y;cout<<g(x,y)<<endl;return 0;
}

判断题

21(1.5分)f函数的返回值小于等于min(n,m)( )

22 (1.5分) f函数的返回值等于两个输入字符串的最长公共子串的长度( )

23 (1.5分)当输入两个完全相同的字符串时,g函数的返回值总是true( )

单选题

24 (3分)将第19行中的“v[m] [n]”替换为“v[n] [m]”,那么该程序( )

A 行为不变 B 只会改变输出 C 一定非正常退出 D 可能非正常退出

25 (3分)当输入为“csp-j p-jcs”时,输出为:( )

A “0” B “1” C “T” D “F”

26 当输入为“csppsc spsccp”时,输出为()

A “T” B “F” C “0” D “1”

2 相关知识点

1) 子序列

一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果

例如

2) 子串

给定串中任意个连续的字符组成的子序列称为该串的子串

3)最长公共子序列

一个序列即是X序列的子序列,也是Y序列的子序列,则该序列称为为X和Y的公共子序列。对于两个序列的公共子序列是不唯一的,因此,最长公共子序列顾名思义就是长度最长的公共子序列

4) 动态规划最长公共子序列长度

最长公共子序列(Longest Common Subsequence, LCS) 问题可以使用动态规划求解。

假设x[1…m]和y[1…n]是两个序列,令c[i,j]表示x[1…i]和y[1…j]的LCS长度

状态转移方程

当i=0或j=0时,c[i,j]=0;
当x[i]=y[j]时,c[i,j]=c[i-1,j-1]+1;
当x[i]!=y[j]时,c[i,j]=max(c[i,j-1],c[i-1,j])。

例如

有2个字符串,字符串1:0123456和字符串2:0346
在这里插入图片描述

5) 字符串连接

在C++中,可以使用加号+运算符或append()方法来连接字符串

#include<bits/stdc++.h>
using namespace std;
/*字符串连接string a="我爱你,",String b="中国!";string c=a+b;//a和b拼接在一起赋值给c,所以c是我爱你,中国!a.append(b);//把b拼接到a上,所以a是我爱你,中国!
*/
int main(){string a="我爱你,";string b="中国!";string c=a+b;cout<<c<<endl; //输出我爱你,中国!a.append(b);cout<<a<<endl;//输出我爱你,中国!string p="";string q="";string pp=p+p;//空字符粗拼接后还是空字符串cout<<pp.size();//空字符串的长度为0,所以输出0return 0;
}
/*
输出 
我爱你,中国!
我爱你,中国!
0
*/ 

6) 数组

数组越界

一般数组越界结果不可预测

#include<bits/stdc++.h>
using namespace std;
/*在C++中,访问数组时出现越界(即访问了不属于该数组的内存区域)不会自动导致程序崩溃。这是因为C++标准并未规定访问数组越界时应当如何反应未定义行为意味着程序的后续行为是不可预测的,可能会导致各种不确定的结果,包括程序崩溃、异常抛出、运行错误结果,  或者看似正常的行为
*/
int a[10][20]; C++
int main(){cout<<a[300][160];//可以输出 未退出 cout<<" test";//可以输出  return 0;
}

vector 数组

#include<bits/stdc++.h>
using namespace std;vector<int> a(11,1);//声明数组a并赋值1 
vector<int> b(11);//声明数组a,默认赋值0 
int main(){a.push_back(2);//在a最后一个元素后面追加2 a.push_back(4);//在a最后一个元素后面追加4 for(int i=0;i<a.size();i++){//输出a数组中每个元素 cout <<a[i]<< ' ';}cout<<endl;for(int i=0;i<b.size();i++){//输出b数组中每个元素cout <<b[i]<< ' ';C++}return 0;
}
/*
输出
1 1 1 1 1 1 1 1 1 1 1 2 4
0 0 0 0 0 0 0 0 0 0 0 
*/

vector数组越界

#include<bits/stdc++.h>
using namespace std;
int m=10,n=20;
//声明二维vector数组 默认值初始化为0 
vector<vector<int> > v(m+1,vector<int>(n+1,1));
int main(){cout<<v[n][m];//访问越界位置  程序非正常退出 cout<<"test";//上一行已非正常退出,无法输出test return 0;
}
/*
无任何输出内容 
*/

3 思路分析

判断题

21(1.5分)f函数的返回值小于等于min(n,m)( )

答案 T

分析

f函数的功能是求2个入参字符串的最长公共子序列的长度,是CSP-J必须掌握的动态规划的算法

最长公共子序列,最大值是2个字符串长度的最小值,所以答案是正确的

22 (1.5分) f函数的返回值等于两个输入字符串的最长公共子串的长度( )

答案 F

分析

f函数的功能是求2个入参字符串的最长公共子序列的长度,不是最长公共子串的长度

f函数的功能是返回最长公共子序列的长度,不是最长公共子串的长度,子序列是不连续的,字串是连续的

例如

// CSP-J-ABCD  ,   CSNJBENCH
// 上面字符串的最长公共子序列是 CJBC 长度是4
// 上面字符串的最长公共子串是 CS 长度是2

23 (1.5分)当输入两个完全相同的字符串时,g函数的返回值总是true( )

答案 T

分析

当输入2个完全相同的字符串时,最长公共子序列的长度时字符串的长度

所以g函数返回true

例如

//CSP-J和CSP-J,传入f函数时对第1个参数连接增加了1倍长度,变成CSP-JCSP-J
//所以参数为CSP-JCSP-J和CSP-J,这2个字符串的最长公共子序列是CSP-J,长度是5

单选题

24 (3分)将第19行中的“v[m] [n]”替换为“v[n] [m]”,那么该程序( )

A 行为不变 B 只会改变输出 C 一定非正常退出 D 可能非正常退出

答案 D

分析

m是n的2倍,改变行列vector会越界,程序会非正常退出

如果输入x和y都是空字符串时,m和n都是0,vector不会越界

例如

/*
CSP-J和CSP-J,传入f函数时对第1个参数连接增加了1倍长度,变成CSP-JCSP-J
所以参数为CSP-JCSP-J和CSP-J
m是10,n是5 ,所以数组是5行10列
填每行列对应数字时是按5行8列填的,取时如果交换,可能去8行去取,会出现vector越界,
vector越界会非正常退出
*/

25 (3分)当输入为“csp-j p-jcs”时,输出为:( )

A “0” B “1” C “T” D “F”

答案 B

分析

输入csp-j p-jcs时,会第1给参数csp-j自连接后变成csp-jcsp-j

可以看出p-jcs在csp-jcsp-j中

返回的最长公共子序列的长度是p-jcs的长度和第2个参数长度相等,所以输出为true或者1

所以选B

26 当输入为“csppsc spsccp”时,输出为()

A “T” B “F” C “0” D “1”

答案 D

分析

输入csppsc spsccp时,会把第1给参数csppsc自连接后变成csppsccsppsc

可以看出spsccp按顺序出现在csppsccsppsc 中

返回的最长公共子序列的长度是spsccp的长度和第2个参数长度相等,所以输出为true或者1

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

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

相关文章

从创意到成功:创业全过程详解

目录 创业目标市场的选择和分析用户画像的描绘软件产品的核心功能和价值主张竞争对手分析及自身竞争优势目标用户的具体需求调研初步的产品设计思路或框架技术栈的选择基于哪些考量如何规划产品的迭代路线图预计的商业模式 1. 创业目标市场的选择和分析 市场选择的重要性 创…

YOLOv10涨点改进:IoU优化 | Powerful-IoU更好、更快的收敛IoU,效果秒杀CIoU、GIoU等 | 2024年最新IoU

💡💡💡本文独家改进:Powerful-IoU更好、更快的收敛IoU,是一种结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数的损失函数 💡💡💡MS COCO和PASCAL VOC数据集实现涨点 《YOLOv10魔术师专栏》将从以下各个方向进行创新: 【原创自研模块】【多组合点优…

spark SQL优化器catalyst学习

一、Catalyst 概述 Catalyst 是 Spark SQL 的优化器&#xff0c;它负责将 SQL 查询转换为物理执行计划。Catalyst 优化器的目标是生成高效的执行计划&#xff0c;以最小化查询的执行时间。它使用了多种优化技术&#xff0c;包括基于规则的优化、基于代价的优化和动态规划等。我…

Dijkstra求最短路篇二(全网最详细讲解两种方法,适合小白)(python,其他语言也适用)

前言&#xff1a; Dijkstra算法博客讲解分为两篇讲解&#xff0c;这两篇博客对所有有难点的问题都会讲解&#xff0c;小白也能很好理解。看完这两篇博客后保证收获满满。 第一篇博客讲解朴素Dijkstra算法Dijkstra求最短路篇一(全网最详细讲解两种方法&#xff0c;适合小白)(p…

openstack 中如何检查VLAN 配置: 确保正确配置了两个 VLAN,并且两个 VLAN 之间进行了正确的路由。

在 OpenStack 中检查 VLAN 配置并确保两个 VLAN 之间进行了正确的路由&#xff0c;可以按照以下步骤进行操作&#xff1a; 查看网络配置&#xff1a; 登录到 OpenStack 控制节点上的命令行界面。使用 neutron net-list 命令查看当前存在的网络列表。找到与你关注的 VLAN 相关的…

计网ppt标黄知识点整理第(2)章节——谢希仁版本、期末复习自用

物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。4 个特性&#xff1a; 机械特性&#xff1a;指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等。 电气特性&#xff1a;指明在接口电缆的各条线上出现…

如何在 JS 中快速读取文件

本文翻译自 How to read files quickly in JavaScript&#xff0c;作者&#xff1a;Daniel Lemire&#xff0c; 略有删改。 假设你需要在服务器上使用JavaScript读取多个文件。在像Node.js这样的运行时环境中&#xff0c;JavaScript有多种读取文件的方式。哪一种是最好的呢&…

Linux软件安装包rpm与tgz格式的区别

rpm与tgz的区别 1、Linux软件包的内容分类2、Linux软件包的格式分类 1、Linux软件包的内容分类 Linux应用程序的软件包按内容类别可分为两类&#xff1a; 可执行文件&#xff08;编译后的二进制软件包&#xff09; 解包后可以直接运行&#xff0c;看不到源代码。例如&#xff0…

基于Springboot驾校预约平台小程序的设计与实现(源码+数据库+文档)

一.项目介绍 系统角色&#xff1a;管理员、教练、学员 小程序(仅限于学员注册、登录)&#xff1a; 查看管理员发布的公告信息 查看管理员发布的驾校信息 查看所有教练信息、预约(需教练审核)、评论、收藏喜欢的教练 查看管理员发布的考试信息、预约考试(需管理…

代码随想录算法训练营Day8|541. 反转字符串II、替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

541. 反转字符串II 1.这道题刚开始把题意理解错了&#xff0c;以为对于任意长度的字符串都只反转[0,k-1]以及[2k,3k-1]区间的值。 2.但实际上是要把一个字符串分成若干长度为2k的小区间&#xff0c;反转前[0,k-1]的字符串&#xff0c;[k,2k-1]保持不变; 3.如果有一个区间字符串…

2024年东北师范CCPC

文章目录 A.Paper WateringB.nIM gAMEE.Checksum A.Paper Watering 思路&#xff1a;题目说有平方和开方两种操作&#xff0c;如果这个数是平方数&#xff0c;那么它开方之后就只能开方&#xff0c;如果平方的话就重复了&#xff0c;反之就有开方和平方两种操作。 代码如下 //…

为了方便看公众号文章,我搭建了个博客,在线看公众号所有历史文章,想看哪天的文章一秒就能找到

公众号没有个网页版的文章列表&#xff0c;只能在电脑和手机客户端看&#xff0c;想看之前的历史文章只能一直往下拉&#xff0c;想找某篇文章非常费劲。 为了方便看公众号文章&#xff0c;我搭建了个博客&#xff0c;博客地址https://sushengbuhuo.github.io/blog &#xf…

通过 SFP 接口实现千兆光纤以太网通信1

基于米联客ARTIX-7 系列开发板及其开发手册。 总体实现框图如下&#xff1a; SFP 接口 SFP 信号定义如下图所示。 Tri Mode Ethernet MAC 设置 由于使用千兆通讯&#xff0c;因此将速率设为 1Gbps。如下图所示。 首先&#xff0c;由于该 IP 需要与 IP 核 1G/2.5G Ethernet …

基于IoTDB 平台的学习和研究

Apache IoTDB&#xff08;物联网数据库&#xff09;是一个针对物联网领域的高性能原生数据库&#xff0c;适用于数据管理和分析&#xff0c;并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集&#xff0c;以及与Apache Hadoop、Spark和Flink的深度集成&…

【面试】生成class文件的编译器有哪些?

目录 1. 说明2. javac3. IDE(集成开发环境)中的编译器3.1 Eclipse编译器3.2 IntelliJ IDEA编译器 1. 说明 1.javac和IDE中的编译器是最常用的和主要的。2.这些编译器都能够将Java源代码编译为可在JVM上执行的字节码文件&#xff0c;是实现Java跨平台特性的关键。3.选择编译器时…

数据管理知识体系必知的14张语境关系图

近期对数据管理知识体系中的语境关系图进行了整体学习梳理,总共有14张图,具体如下,供大家参考。应该说语境关系图和环境因素六边形图是各有侧重、互为补充关系。语境关系图是环境因素六边形图的细化,描述了每个知识领域中的细节,相当于数据管理的微观视角, 包括与人员、 …

kali中切换python版本

kali中切换python版本 在日常使用的过程中&#xff0c;可以通过一些工具来做打靶环境&#xff0c;或者工具的启动&#xff0c;都和python关联&#xff0c;而有时存在工具安装&#xff0c;或者运行的时候出现报错&#xff0c;这时候极大可能是因为我们本地的kali中python的版本不…

Android Studio | 小白如何运行别人的安卓项目

目录 Step1&#xff1a;正确地打开项目 Step2&#xff1a;AS 同步时报错 Step3&#xff1a;同步完成后启动 Step4&#xff1a;启动成功 说明&#xff1a;本文简称 Android Studio 为 AS Step1&#xff1a;正确地打开项目 重点&#xff1a;确认好项目的根目录是哪个目录&am…

进程与线程(三)

进程与线程&#xff08;三&#xff09; 进程间通信传统间的进程间通信机制无名管道无名管道的特征无名管道的创建父子进程通信测试管道的大小管道读写易出现的问题 有名管道创建有名管道有名管道的写端代码有名管道的读端代码 信号信号的特征产生信号硬件来源软件来源发送信号的…

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系统中&#xff0c;chmod 命令是非常重要的。它可以用于修改文件和目录的访问权限&#xff0c;以及控制用户对系统资源的访问。在这篇博客中&#xff0c;我们将深入探讨 chmod 命令的使用方法&#xff0c;以及如何使用它来管理文件和目录的访问…