CSP-J 2023 入门级 第一轮 阅读程序(2)

【题目】

CSP-J 2023 入门级 第一轮 阅读程序(2)

#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. f函数的返回值小于等于min(n,m)。( )
22. f函数的返回值等于两个输入字符串的最长公共子串的长度。( )
23. 当输入两个完全相同的字符串时,g函数的返回值总是true( )
单选题
24. 将第19行中的"v[m][n]“替换为"v[n][m]”,那么该程序( )
A. 行为不变 B. 只会改变输出 C. 一定非正常退出 D. 可能非正常退出
25. 当输入为"csp-j p-jcs"时,输出为()
A. “0” B. “1” C. “T” D. “F”
26. 当输入为"csppsc spsccp"时,输出为:()
A. “T” B. “F” C. “0” D. “1”

【题目考点】

1. 线性动态规划

求最长公共子序列
参考:信息学奥赛一本通 1265:【例9.9】最长公共子序列

2. vector

vector是顺序存储结构的线性表(顺序表),可以将其视为长度可变的数组。
声明vector对象:
vector<数据类型> 对象名;

例:声明保存int类型的顺序表v:vector<int> v;

使用构造函数:
vector<数据类型> 对象名(线性表长度);

例:声明保存int类型的顺序表v,线性表长度为10(即包含v[0]~v[9]共10个元素,初值为0):vector<int> v(10);

vector<数据类型> 对象名(线性表长度, 元素初值);

例:声明保存int类型的顺序表v,线性表长度为10,元素初值为1。(即包含v[0]~v[9]共10个元素,每个元素初值为1):vector<int> v(10, 1);

【解题思路】

先看f函数

int f(string x, string y) {int m = x.size();int n = y.size();

传入两个字符串x和y,m是字符串x的长度(字符个数),n是字符串y的长度。

vector<vector<int>> v(m + 1, vector<int>(n + 1, 0));

vector<int>(n + 1, 0)表示声明一个保存int类型变量的vector,长度是n+1(这个vector中有n+1个元素),元素初值为0。
vector<vector<int>>表示外层vector中每个元素都是vector<int>类型的对象。
v(m+1, vector<int>(n+1, 0))表示外层vector对象名是v,长度是m+1,每个元素的初值都是vector<int>(n+1, 0)
外层顺序表中有m+1个元素,每个元素都是一个保存int类型的长度为n+1的顺序表。
实际这一段就是在使用vector声明一个m+1行n+1列的二维数组v。

    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];
}

这一段必须先学过线性动规中的求最长公共子序列问题后才可以理解。如对该问题不清楚,详见:(信息学奥赛一本通 1265:【例9.9】最长公共子序列)
这段代码中,v[i][j]是状态,表示x字符串的前i个字符和y字符串的前j个字符的最长公共子序列的长度。
最后返回v[m][n],即x字符串的前m个字符和y字符串的前n个字符的最长公共子序列的长度。
因此,int f(string x, string y)求的就是x字符串和y字符串的最长公共子序列的长度。

bool g(string x, string y) {if (x.size() != y.size()) {return false;}return f(x + x, y) == y.size();
}

g函数传入两个字符串x,y。

  • 如果两字符串长度不同,则返回false。
  • 如果长度相同,先求x+x(x后面再连接x得到的字符串)和y字符串的最长公共子序列的长度,看该长度是否与y的长度相同。也就是看x+x中是否存在一个子序列是y字符串。(在x+x中顺序选取部分字符(可以跳着选),看能否选出完整的y字符串)。
int main() {string x, y;cin >> x >> y;cout << g(x, y) << endl;return 0;
}

主函数,输入x,y字符串,输出x+x是否存在一个子序列是y字符串,如果存在输出1,否则输出0。

判断题
21. f函数的返回值小于等于min(n,m)。( )

答:T
f函数求x与y的最长公共子序列的长度,两字符串最长公共子序列的长度不会大于两字符串中任意一个字符串,最长时也就是与两字符串中更短的字符串一样长。该判断正确。

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

答:F
f函数的返回值是两个输出字符串的最长公共子序列的长度,而不是最长公共子串。子串是连续元素构成的子序列。子序列可以是不连续的,子串必须是连续的。
比如bcdabcde的子串,也是子序列。而aceabcde的子序列,不是子串。

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

答:T
当x与y相同时,x+x中一定存在子串y(即子串x),子串就是子序列,所以x+x与y的最长公共子序列的长度就是y的长度,g函数返回真。

单选题
24. 将第19行中的"v[m][n]“替换为"v[n][m]”,那么该程序( )
A. 行为不变 B. 只会改变输出 C. 一定非正常退出 D. 可能非正常退出

答:D
如果输入的x与y长度不等,那么不会运行到f函数,直接输出0,没有非正常退出。
如果输入的x与y长度相等(空字符串无法输入,字符串长度最小为1),在g函数中调用的是f(x+x, y),运行到函数内部,int f(string x, string y),形参x的长度一定是y的二倍。也就是m == 2*n,因此也一定有m > n。
把v当做二维数组,v的第一维的长度是m+1,可以使用的下标范围是0~m。第二维的长度是n+1,可以使用的下标范围是0~n。由于m>n,当取v[n][m]时第二维数组越界,会产生运行时错误。(出现运行时错误时,程序可能会正常退出,也可能非正常退出。我们应该默认它会非正常退出。)

  1. 当输入为"csp-j p-jcs"时,输出为()
    A. “0” B. “1” C. “T” D. “F”

答:B
看csp-jcsp-j中是否存在子序列是p-jcs。
仔细看,是存在的。csp-jcsp-j。
第3到第7字符就是p-jcs。
输出1。(输出布尔值真时,输出1,输出布尔值假时,输出0)

  1. 当输入为"csppsc spsccp"时,输出为:()
    A. “T” B. “F” C. “0” D. “1”

答:D
看csppsccsppsc中是否存在子序列是spsccp。
仔细看,是存在的。csppsccsppsc。
第2,3,5,6,7,9字符连起来就是spsccp。
输出1。(输出布尔值真时,输出1,输出布尔值假时,输出0)

【答案】

  1. T
  2. F
  3. T
  4. D
  5. B
  6. D

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

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

相关文章

【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 6.捎带应答、延时应答 1.连接管理机制 正常情况下&…

Vulnhub系列靶机-Hackadmeic.RTB1

文章目录 Vulnhub系列靶机-Hackadmeic.RTB11. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用3.1 反弹Shell 4. 内核提权 Vulnhub系列靶机-Hackadmeic.RTB1 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.184扫描到了…

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java &#xff0c;通常 Interface 的问题多多少少会遇到&#xff0c;而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型&#xff08;Abstract Type&#xff09;&…

SkyWalking快速上手(一)——安装单机版SkyWalking、使用SkyWalking

文章目录 什么是SkyWalking为什么选择SkyWalking安装步骤前置条件环境要求下载 SkyWalking 配置 SkyWalkingSkywalking 使用Agent 配置Collector 配置 启动 SkyWalking配置SkyWalking代理 SkyWalking的监控功能分布式调用链追踪性能指标监控告警和报警 总结 什么是SkyWalking …

javabean项目专项练习(1) 文字格斗游戏

main中是这样写的 如下是character类的描述 总结一下(个人) : 这是一题面向对象的编程, 个人编程后感是: 核心就是在于自己会不会取定义一个类, 如果是多个对象(同一个类),能不能捋顺类的方法的关系,个人觉得黑马程序员up主给出来的分析方法特别好用. 步骤: 先把在类里该该…

2. PCIE TLP解包封包

第二十一讲、PCIE的TLP包的封包解包原理.pdf 00 Packet Coding.docx 掌握如何发送接收 Mrd&#xff08;memory read TLP&#xff09;、Mwr(Memory write TLP)、Cpl(Completion TLP)和Cpld(Completion with data TLP) 命令包 1、 TLP 包是由 PCIE 的 Endpoint 或者 Root Complex…

两数之和-(哈希)

牛客网: BM50 题目: 数组中两数之和为给定值&#xff0c;返回下标 思路: 遍历数组获取idx与value&#xff0c;value为key, idx为val存入map中&#xff0c;每次遍历时判断target-value是否已在map中有值&#xff0c;值即为先前存入的下标&#xff0c;取出与当前坐标组合为数组…

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出 目录 多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向…

60从零开始学Java之与数字相关的类有哪些?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们在解决实际问题时&#xff0c;会经常对数字、日期和系统设置进行处理&#xff0c;比如在我们的代…

二分搜索算法

二分搜索算法 二分搜索 对于一组有顺序的数据&#xff0c;不采用常见的遍历方式找到需要的数据&#xff0c;而是利用其规律&#xff0c;比中间数据小的一定在中间数据左边&#xff0c;比中间数据大的一定在中间数据右边&#xff0c;每次排除一般的数据&#xff0c;从而提高搜…

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…

SpringBoot+MyBatisPlus+MySQL不能储存(保存)emoji表情问题解决

1.之前在学习过程中不知道utf8和utf8mb4的区别&#xff0c;也没过多去了解&#xff0c;直到最近设置的数据库编码全是utf8后发现问题所在了&#xff0c;居然不能储存表情包&#xff01;&#xff01;&#xff01;整个人直接傻了&#xff0c;后面知道了utf8是3字节不能储存表情&a…

【MTK】【WFD】手机投屏到投影仪不显示画面

问题分析: 在投屏过程中,有时候会出现WFD sink端回复的video 格式表不正确,sink表示是支持VESA(3fffffff),但是当手机根据协商结果得到最优分辨率并发送给sink端时,sink端看上去没有正常播放,其实实际上应该是不支持的。 比如我们这个问题就是CES表中的0001ffff,最大…

SadTalker 让图片说话

参考&#xff1a;https://github.com/OpenTalker/SadTalker 其他类似参考&#xff1a;https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github&#xff0c;下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints&#xff0c;把下载sadtalker里模型拷贝进…

层次查询和分析函数(LAG、LEAD)在号段选取中的应用

1. 问题的提出 在实际工作中&#xff0c;我们常常会碰到号段选取的问题&#xff0c;例如&#xff1a; 一组连续的数&#xff0c;去掉中间一些数&#xff0c;要求出剩下的数的区间&#xff08;即号段&#xff09;例如&#xff1a;一串数字为1,2,3,4,7,9,10&#xff0c;则号段为…

如何在Gazebo中实现多机器人编队仿真

文章目录 前言一、仿真前的配置二、实现步骤1.检查PC和台式机是否通讯成功2.编队中对单个机器人进行独立的控制3、对机器人进行编队控制 前言 实现在gazebo仿真环境中添加多个机器人后&#xff0c;接下来进行编队控制&#xff0c;对具体的实现过程进行记录。 一、仿真前的配置…

JAVAEE初阶相关内容第十二弹--多线程(进阶)

目录 一、JUC的常见类 1、Callable接口 1.1callable与runnable 1.2代码实例 &#xff08;1&#xff09;不使用Callable实现 &#xff08;2&#xff09;使用Callable实现 1.3理解Callable 1.4理解FutureTask 2、ReentrantLock 2.1ReentrantLock的用法 2.2ReentrantLoc…

【面试题】Js数组去重都有哪些方法?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 1. indexOf 定义&#xff1a; indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置…

springboot整合sentinel完成限流

1、直入正题&#xff0c;下载sentinel的jar包 1.1 直接到Sentinel官网里的releases下即可下载最新版本&#xff0c;Sentinel官方下载地址&#xff0c;直接下载jar包即可。不过慢&#xff0c;可能下载不下来 1.2 可以去gitee去下载jar包 1.3 下载完成后&#xff0c;进行打包…

【办公小神器】:快速批量转换Word、Excel、PPT为PDF脚本!

文章目录 ✨哔哩吧啦✨脚本使用教程✨温馨小提示设置&#x1f4da;资源领取 专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x1f525;小玩意儿&#x1f525;Web前端学习tkinter学习笔记Excel自动化处理 ✨哔哩吧啦 前…