P8703 [蓝桥杯 2019 国 B] 最优包含
题目描述
我们称一个字符串 SSS 包含字符串 TTT 是指 TTT 是 SSS 的一个子序列,即可以从字符串 SSS 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 TTT 完全一样。
给定两个字符串 SSS 和 TTT,请问最少修改 SSS 中的多少个字符,能使 SSS 包含 TTT。
输入格式
输入两行,每行一个字符串。第一行的字符串为 SSS,第二行的字符串为 TTT。两个字符串均非空而且只包含大写英文字母。
输出格式
输出一个整数,表示答案。
输入输出样例 #1
输入 #1
ABCDEABCD
XAABZ
输出 #1
3
说明/提示
对于 20%20 \%20% 的评测用例, 1≤∣T∣≤∣S∣≤201 \leq|T| \leq|S| \leq 201≤∣T∣≤∣S∣≤20;
对于 40%40 \%40% 的评测用例, 1≤∣T∣≤∣S∣≤1001 \leq|T| \leq|S| \leq 1001≤∣T∣≤∣S∣≤100;
对于所有评测用例, 1≤∣T∣≤∣S∣≤10001 \leq|T| \leq|S| \leq 10001≤∣T∣≤∣S∣≤1000。
蓝桥杯 2019 年国赛 B 组 F 题。
C++实现
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 1010
int dp[maxn][maxn];
string s,t;
int main(){
cin>>s>>t;
s = " "+s;t = " "+t;
memset(dp,inf,sizeof dp);
for(int i=0;i<=s.size();i++)
dp[i][0] = 0;
for(int i=1;i<=s.size();i++)
for(int j=1;j<=s.size();j++){
if(s[i]==t[j])
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = min(dp[i-1][j-1]+1,dp[i-1][j]);
}
printf("%d",dp[s.size()][t.size()]);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
C++实现蓝桥杯最优包含算法题
7万+

被折叠的 条评论
为什么被折叠?



