正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-J 2023 第一轮真题 › 第 26 题

CSP-J 2023 第一轮 第 26 题:程序(二):输入 csppsc 和 spsccp 的输出

阅读程序 · 动态规划 · 难度 很难 · 答案 D

题目

#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;
}
CSP-J 2023 第一轮 第 26 题 原题
原题扫描(页面加载后可直接在线作答)

本小题

当输入为 csppsc spsccp 时,输出为()。

选项

  • A. T
  • B. F
  • C. 0
  • D. 1

答案

D

题解

答案是 D.1。

先看两个函数的作用:

  • f(x,y) 求两个字符串的最长公共子序列长度。子序列可以跳过字符,但不能改变字符的先后顺序。
  • g(x,y) 先判断长度是否相等,再判断 y 是否是 x+x 的子序列。

本题中,x、y 的长度都是 6,并且:

``text x+x:c s p p s c c s p p s c 位置:1 2 3 4 5 6 7 8 9 ... ``

选取第 2、3、5、6、7、9 个字符,得到:

``text s p s c c p ``

恰好是 y,所以 f(x+x,y)=6,g(x,y) 返回 true。

cout 默认将布尔值 true 输出为 1,因此选 D。

注意:这里判断的是子序列,不要求字符连续。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号