E07 线性DP P2758 编辑距离
$f_{i,j}$ 表示考虑 $a$ 的前 $i$ 个字符,$b$ 的前 $j$ 个字符时的最少操作次数
$$ f_{i,j}=\left\{
\begin{aligned}
& f_{i-1,j-1} & a_i=b_j \\
& \min(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1 & a_i \neq b_j \\
\end{aligned}
\right. $$
// 线性DP O(n^2) #include<bits/stdc++.h> using namespace std; const int N=2010; char a[N],b[N]; int n,m,f[N][N]; int main(){ cin>>a+1>>b+1; n=strlen(a+1), m=strlen(b+1); for(int i=1;i<=n;i++) f[i][0]=i; for(int i=1;i<=m;i++) f[0][i]=i; //a取0个,b取i个的操作次数 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i]==b[j]) f[i][j]=f[i-1][j-1]; //ai等于bj,不用操作 else f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1; //二维表当前状态之前的三个状态转移 } } printf("%d\n",f[n][m]); }
浙公网安备 33010602011771号