E07 线性DP P2758 编辑距离

E07 线性DP 编辑距离_哔哩哔哩_bilibili

 

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]);
}

 

posted @ 2023-04-10 09:19  董晓  阅读(1083)  评论(0)    收藏  举报