CSP 2023 入门级第一轮 第20题讲解

原题链接:试题 - CSP 2023 入门级第一轮 - 洛谷有题

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int min(int x, int y, int z) {
    return min(min(x, y), z);
}
int edit_dist_dp(string str1, string str2) {
    int m = str1.length();
    int n = str2.length();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1));
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0)
                dp[i][j] = 1处;
            else if (j == 0)
                dp[i][j] = 2处;
            else if (3处)
                dp[i][j] =4处;
            else
                dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j],5处);
        }
    }
    return dp[m][n];
}
int main() {
    string str1, str2;
    cin >> str1 >> str2;
    cout << "Mininum number of operation:" << edit_dist_dp(str1, str2) << endl;
    return 0;
}
  1. (编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
  2. ①处应填( )  A. j     B. i   C.m   D.n
  3. ②处应填( )   A. j     B. i   C.m   D.n
  4. ③处应填( )   A. str1[i-1]==str2[j-1]       B. str1[i]==str2[j]   C. str1[i-1]!=str2[j-1]    D.str1[i]!=str2[j]
  5. ④处应填( )  A. dp[i-1][j-1]+1   B. dp[i-1][j-1]   C. dp[i-1][j]   D. dp[i][j-1]
  6. ⑤处应填( ) A. dp[i][j] + 1     B. dp[i-1][j-1]+1    C.dp[i-1][j-1]     D. dp[i][j]

 当然一会我们会出示答案

但首先我们可以先思考一下:它在干什么?

给个例子:S1= "abcde"            S2="abcft"    操作次数设为sum;

先从S1=" ",S2=" "开始      那么十分简单,sum=0;

加一下  S1="a ",S2=" "  sum=1;  //只需要把a删去

...............

那么我们可以得到一个表格  (如下)

abcde
012345
a101234
b210123
c321012
f432112
t543222

 来吧,找规律吧!!!!!!!!!!!!!!!!(下面我会公布,建议没有学过的可以思考一下)

揭晓答案:可以分为 4种情况

1.当S1的长度是0时   sum=S2的长度

2.当S2的长度是0时   sum=S1的长度

3.S1的值与S2相等时(比方说绿色的格子S1=“ab”,S2="ab",那么就是它左上方的值)

4.S1的值与S2不相等时(比方说蓝色的格子S1=“ab”,S2="abcf",那么就是它min(左上方的值,上方的值,左边的值)   其中min()表示最小值)

5.最终的答案便是橙色的格子

这个表格完全可以由二维数组完成(也就是上面题中的dp[][])

所以选择题的答案是ABABC

#include<bits/stdc++.h>
using namespace std;
int p(string s1,string s2) 
{
	int l=s1.size(),l1=s2.size();
    vector<vector<int > > dp(l+1,vector<int>(l1+1));
    for (int i=0;i<=l;i++) 
	{
        for(int j=0;j<=l1;j++) 
		{
            if(i==0)
            {
            	dp[i][j]=j;
			}
            else if(j==0)
            {
            	dp[i][j]=i;
			}
            else if(s1[i-1]==s2[j-1])
            {
            	dp[i][j]=dp[i-1][j-1];
			}
            else
            {
            	dp[i][j]=1+min(dp[i][j - 1],min(dp[i - 1][j],dp[i-1][j-1]));
			}
        }
    }
    cout<<dp[l][l1];
}
int main() {
    string s1,s2;
    cin>>s1>>s2;
    p(s1,s2);
    return 0;
}

如有错误,敬请指正

2023 csp-j入门级第一轮是中国计算机科学会议(CSP)针对初学者设计的一道。根据目的具体要求,试内容可能涉及算法、编程语言、数据结构等方面的知识。 对于这样的试,学生们需要运用自己所学的知识和技能,通过编程实现目要求。例如,可能需要设计一个算法来解决一个具体的问,或者使用特定的数据结构来组织和处理数据。 为了完成这样的试,学生们首先需要理解目的要求和限制条件,确保对目中涉及的概念和术语有所了解。接下来,他们需要分析问,确定解决问的方法和步骤。在实际编程实现时,可以选择合适的编程语言和工具,并按照目要求进行编码。 在完成编码后,学生们需要进行测试和调试,确保程序能够正确运行并得到正确的结果。在测试过程中,可以使用一些已知的测试用例来验证程序的正确性,并对程序进行优化,以提高其性能。 最后,将代码提交,并等待评审结果。评审过程可能涉及代码质量、算法复杂度、正确性等方面的考量。根据评审结果,学生们可以了解自己的编程水平和不足之处,并进行相应的学习和提高。 总体来说,解答2023 csp-j入门级第一轮需要学生在编程基础上运用算法和数据结构的知识,进行问的分析和解决。通过这样的学习和实践,学生们可以提高自己的编程能力,并逐渐成长为优秀的程序员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值