P2758 编辑距离(ATE)
\(\text{ATE for "Anywhere To the End".}\)
简单来说,设序,将任意位置操作统一推到末尾。
对于本题,直接做毫无头绪,正难则反就是扯淡。
放到末尾后,设 \(f(i,j)\) 为 \(A_i,B_j\) 及其前面完成匹配最少操作数。
如此,操作就容易表述,能实现 \(O(nm)\) 求解。
#include<bits/stdc++.h>
using namespace std;
const int N=2025;
char A[N],B[N];
int a,b,dp[N][N];
inline int min(int a,int b,int c){return min(min(a,b),c);}
int main(){
scanf("%s%s",A+1,B+1),a=strlen(A+1),b=strlen(B+1);
for(int i=0;i<=a;i++) dp[i][0]=i;
for(int i=1;i<=b;i++) dp[0][i]=i;
for(int i=1;i<=a;i++) for(int j=1;j<=b;j++){
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
if(A[i]==B[j]) dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
}
printf("%d",dp[a][b]);
return 0;
}

浙公网安备 33010602011771号