洛谷 P2758 编辑距离(DP)

题目链接: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\n",f[la][lb]);
21     return 0;
22 }
AC代码

 

posted @ 2020-11-05 21:46  dfydn  阅读(64)  评论(0编辑  收藏  举报