信息學奧賽初賽天天練-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.pswp.cn/bicheng/20680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20680.shtml
英文地址,請注明出處:http://en.pswp.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;以及如何使用它來管理文件和目錄的訪問…