洛谷2758 编辑距离

题目地址

题解

非常经典的$DP$题目。
转移方程和$LCS$问题非常相似,
设$f(i,j)$表示$a$串的第$i$位匹配到$b$串的第$j$位所需要的最少操作数,
那么有:

以上三个数分别对应删除,修改和插入
时间复杂度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cctype>
#define INF 2000000000
using namespace std;
typedef long long ll;
char a[2005],b[2005];
int f[2005][2005],l1,l2,l3;
int read(){
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return f*x;
}
void init(){
scanf("%s%s",a,b);
l1=strlen(a),l2=strlen(b);
}
void solve(){
f[0][0]=0;
for(int i=1;i<=l1;i++)
f[i][0]=i;
for(int i=1;i<=l2;i++)
f[0][i]=i;
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(a[i-1]==b[j-1]){
f[i][j]=f[i-1][j-1];
}else
f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1;
//printf("%d %d:%d\n",i,j,f[i][j]);
}
}
printf("%d\n",f[l1][l2]);
}
int main(){
init();
solve();
return 0;
}