题目链接:https://www.luogu.com.cn/problem/P2758
设f[i][j]表示把A中[1,i]变成B中[1,j]的最小操作数。
如果A[i]==B[j],那么直接转移。
否则有三种情况:
f[i][j]=f[i-1][j-1],把A[i]换成B[j]
f[i][j]=f[i-1][j],把A[i]删掉
f[i][j]=f[i][j-1],把A中填一个
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int N=2005; 6 char a[N],b[N]; 7 int f[N][N]; 8 int main(){ 9 scanf("%s%s",a+1,b+1); 10 int la=strlen(a+1),lb=strlen(b+1); 11 for(int i=1;i<=la;i++) 12 for(int j=1;j<=lb;j++){ 13 f[i][0]=i; f[0][j]=j; 14 if(a[i]==b[j]){ 15 f[i][j]=f[i-1][j-1]; 16 continue; 17 } 18 f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))+1; 19 } 20 printf("%d ",f[la][lb]); 21 return 0; 22 }