2019蓝桥杯国赛C++B组程序题部分

最优包含

AC2553
类似编辑距离DP的题目

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
char a[1005],b[1005];
int f[1005][1005];//f(i,j) a的前 i 个包含 b的前  j 个 的最小操作数 
int main(){
	memset(f,0x3f,sizeof f);
	scanf("%s",a+1);
	scanf("%s",b+1);
	int lena=strlen(a+1);
	int lenb=strlen(b+1);
	f[0][0]=0; 
	for(int i=1;i<=lena;i++){
		f[i][0]=0;
		for(int j=1;j<=lenb;j++){
			f[i][j]=f[i-1][j];
			//前 i-1个就可以包含b的前 j 个
			//所以前 i个 可以直接等于i-1的操作数(j相同条件) 
			if(a[i]==b[j]){
				f[i][j]=f[i-1][j-1];
				//根据我们的表达式
				// a的前 i 个包含 b的前  j 个 的最小操作数 
				//假如 a=abcd,b=adc
				//f(2,2)很明显是 2
				//f(3,3)由于a[3]=b[3]所以根本没影响等于f(2,2)=2 
			}
			f[i][j]=min(f[i][j],f[i-1][j-1]+1);
			//进行一次操作可以理解成让有一个没满足条件的字符串满足条件
			// //假如 a=abcd,b=adc
			//f(1,1)很明显是 1 
			//f(2,2)时,a[2]!=b[2],就直接进行一次操作,操作具体干什么不重要
			//关键是结果为操作数加一,同时满足匹配  f(2,2)=f(1,1)+1;
		}
	} 
	cout<<f[lena][lenb];
  return 0;
}




//  freopen("testdata.in", "r", stdin);

上一篇:P2801 教主的魔法


下一篇:题解 洛谷P3955 【图书管理员】