蓝桥杯2019年第十届国赛真题-最优包含

题目描述

我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样。

给定两个字符串 S 和 T,请问最少修改 S 中的多少个字符,能使 S 包含T ?

输入

输入两行,每行一个字符串。第一行的字符串为 S,第二行的字符串为 T。两个字符串均非空而且只包含大写英文字母。

输出

输出一个整数,表示答案。

样例输入复制

ABCDEABCD
XAABZ

样例输出复制

3

提示

对于 20% 的评测用例,1 ≤ |T| ≤ |S | ≤ 20;
对于 40% 的评测用例,1 ≤ |T| ≤ |S | ≤ 100;
对于所有评测用例,1 ≤ |T| ≤ |S | ≤ 1000。

解题思路

套用动态规划模板,不断试错

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char S[N],T[N];
int dp[N][N]; 
int main(){
 	memset(dp,0x4f,sizeof(dp));		//求最小值赋最大值 
 	dp[0][0]=0;		//初始化[0][0]; 
 	cin>>S+1;
 	cin>>T+1;
 	int ls=strlen(S+1);
 	int lt=strlen(T+1);
 	for(int i=1;i<=ls;i++){
	 	dp[i][0]=0;   //每次初始化第一个背包 
	 	for(int j=1;j<=lt;j++){
	 		//以下就是写出基本模板去试错了 
			dp[i][j]=dp[i-1][j]; 
			if(S[i]==T[j])
			dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
			else
			dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1); 	
		}
	} 
	cout<<dp[ls][lt];
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值