题面:
思路:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010;
ll n,m;
char a[N],b[N];
int f[N][N];
int main()
{
cin>>n;
cin>>a+1;
cin>>m;
cin>>b+1;
//边界处理当f[n][0]时需要的步骤是删除n步a有的元素
//同理f[0][m]时需要的步骤是删除m步b有的元素
for(int i=0;i<=n;i++) f[i][0]=i;
for(int i=0;i<=m;i++) f[0][i]=i;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=min(f[i-1][j]+1,f[i][j-1]+1);//比较增删的操作数取小值
//这里是替换的操作,判断是否相同;
if(a[i]==b[j]) f[i][j]=min(f[i][j],f[i-1][j-1]);//相同的话这不需要操作数+1(不需要替换)
//不同则需要加上替换的操作数1
else f[i][j]=min(f[i][j],f[i-1][j-1]+1);
}
}
cout<<f[n][m]<<endl;
return 0;
}