原题链接:试题 - 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;
}
- (编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
- ①处应填( ) A. j B. i C.m D.n
- ②处应填( ) A. j B. i C.m D.n
- ③处应填( ) A. str1[i-1]==str2[j-1] B. str1[i]==str2[j] C. str1[i-1]!=str2[j-1] D.str1[i]!=str2[j]
- ④处应填( ) A. dp[i-1][j-1]+1 B. dp[i-1][j-1] C. dp[i-1][j] D. dp[i][j-1]
- ⑤处应填( ) 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删去
...............
那么我们可以得到一个表格 (如下)
空 | a | b | c | d | e | ||||
空 | 0 | 1 | 2 | 3 | 4 | 5 | |||
a | 1 | 0 | 1 | 2 | 3 | 4 | |||
b | 2 | 1 | 0 | 1 | 2 | 3 | |||
c | 3 | 2 | 1 | 0 | 1 | 2 | |||
f | 4 | 3 | 2 | 1 | 1 | 2 | |||
t | 5 | 4 | 3 | 2 | 2 | 2 | |||
来吧,找规律吧!!!!!!!!!!!!!!!!(下面我会公布,建议没有学过的可以思考一下)
揭晓答案:可以分为 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;
}
如有错误,敬请指正