信息学奥赛初赛天天练-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,所以输出0
	return 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【30天精通Prometheus:一站式监控实战指南】第12天:windows_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

PVE虚拟机 安装 OpenWrt

1、创建虚拟机 2、操作系统 3、磁盘&#xff0c;先删除 4、网络 5、其它默认 6、在 local 分区上传镜像 7、登录PVE虚拟机 # 切换到镜像目录 cd /var/lib/vz/template/iso/# 把镜像导入磁盘 qm importdisk 102 openwrt-buddha-version-v7_2022_-x86-64-generic-squashfs-uefi…

从零开始学习Slam-旋转矩阵旋转向量四元组(二)

本文参考&#xff1a;计算机视觉life 仅作笔记用 书接上回&#xff0c;上回不清不楚的介绍了旋转矩阵&旋转向量和四元组 现在回顾一下重点&#xff1a; 本着绕谁谁不变的变则 假设绕z轴旋转θ&#xff0c;旋转矩阵为&#xff1a; 再回顾一下旋转向量的表示以及这个基本记不…

GEE 10m 全球 LULC 数据集 ESRI Land Cover

土地利用土地覆盖&#xff08;LULC&#xff09;地图在许多行业部门和发展中国家越来越成为决策者的重要工具。这些地图提供的信息有助于通过更好地理解和量化地球过程和人类活动的影响&#xff0c;从而制定政策和土地管理决策。 ESRI Land Cover 数据介绍 ArcGIS Living Atlas …

NIUSHOP多商户V6版预售背后的前端技术革新

随着电子商务的快速发展&#xff0c;多商户电商平台成为了市场上的热门选择。在这个背景下&#xff0c;NIUSHOP多商户V6版的预售活动引发了广泛关注。本文将从前端技术的角度&#xff0c;探讨NIUSHOP多商户V6版在预售背后所蕴含的技术革新和亮点。 一、引言 NIUSHOP多商户系统…

关于Maven环境变量配置的报错The JAVA_HOME environment variable is not defined correctly的解决

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

VLAN的概念及优势

文章目录 VLAN的概念及优势分割广播域 广播域vlanVLAN的优势 VLAN的种类静态VLAN动态VLAN 静态VLAN的配置静态VLAN范围配置静态VLAN的步骤 TRUNK介绍与配置三层交换机转发原理三层交换技术mls基于CEF的MLSCEF是一种基于拓补转发的模型 三层交换机的配置层 VLAN的概念及优势 分…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

【详细讲解版】史上最全transformer面试题

史上最全transformer面试题答案 1.Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09;2.Transformer为什么Q和K使用不同的权重矩阵生成&#xff0c;为何不能使用同一个值进行自身的点乘&#xff1f;3.Transformer计算attention的时候为…

Excel 将分组头信息填入组内明细行

Excel由多个纵向的分组表组成&#xff0c;组之间由空白行隔开&#xff0c;每组第1、2行的第2格是分组表头&#xff0c;第3行是列头&#xff0c;第1列和第6列数据是空白的&#xff1a; ABCDEF1ATLANTIC SPIRIT2Looe3VesselSpeciesSizeKgDateLocation4POLLACK22.523/04/20245POL…

内网-win1

一、概述 1、工作组&#xff1a;将不同的计算机按功能(或部门)分别列入不同的工作组 (1)、查看&#xff08;windows&#xff09; 查看当前系统中所有用户组&#xff1a;打开命令行--》net localgroup查看组中用户&#xff1a;打开命令行 --》net localgroup 后接组名查看用户…

进程与线程(一)

进程与线程&#xff08;一&#xff09; 理解什么是并发编程进程的相关概念什么是进程对比进程和程序理解进程是一个独立的可调度的任务理解进程是程序执行和资源管理的最小单位进程状态转换图进程的种类 进程相关命令进程状态标志ps命令-aux:-axj:(可以查看到进程的PPID)pstree…

【通信专题】I2C通信硬件概述

通信协议在组织设备之间通信时扮演着重要角色。它基于系统要求而以不同方式进行设计。此类协议具有明确的、为实现成功通信而协商一致的规则。 I2C历史 I2C,即Inter-Integrated Circuit,是一种常用的串行通信协议。I2C总线创建于1982年,由飞利浦公司设计,旨在利用简单、稳…

APISIX的安装与测试(springboot服务测试)

安装&#xff1a; 1.1安装依赖&#xff1a; curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -1.2 安装 OpenResty yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum i…

Java关键字详解

文章目录 什么是关键字&#xff1f;数据类型&#xff08;10个&#xff09;byte、char、boolean、short、int、float、long、double、void、enum 流程控制&#xff08;12个&#xff09;if、else、do、while、for 、switch、case、assertbreak&#xff08;跳出循环&#xff09;co…

[有监督学习] 8.详细图解神经网络

神经网络 一直以来&#xff0c;人们都认为神经网络&#xff08;Neural Network&#xff0c;NN&#xff09;是模仿生物体的神经网络设计而成的。神经网络既可以用于回归&#xff0c;也可以用于分类&#xff0c;但在实际应用中常用于分类。基于神经网络的深 度学习因在图像识别和…

五分钟“手撕”栈

实现代码放开头&#xff0c;供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…