最短编辑距离——线性dp
902. 最短编辑距离 - AcWing题库
刚拿到题感觉无从下手。看了讲解之后才领悟了一丢丢。既然题目是问操作次数的最小值,那么我们就把每一次可以进行的操作分一下类。
首先还是按照y总的方法,先分析出状态表示。因为题中问的是将A变成B需要的操作次数,所以我们的状态表示可以是为了让A的前i个字符与B的前j个字符相同的操作次数。求的是最小值min。
对于状态计算,我们可以把f [ i , j ]按照操作的方式进行划分。dp都是分析该状态下最后一个不同的操作。
1.删除–将字符串
1 #include2 using namespace std; 3 const int N=1e3+100; 4 char a[N],b[N]; 5 int f[N][N]; 6 int main() 7 { 8 int n,m; 9 scanf("%d%s",&n,a+1); 10 scanf("%d%s",&m,b+1); 11 for(int i=1;i<=n;i++)f[i][0]=i; //全部删除 12 for(int i=1;i<=m;i++)f[0][i]=i; //全部插入 13 14 for(int i=1;i<=n;i++) 15 { 16 for(int j=1;j<=m;j++) 17 { 18 f[i][j]=min(f[i][j-1],f[i-1][j])+1; 19 if(a[i]==b[j])f[i][j]=min(f[i][j],f[i-1][j-1]); 20 else f[i][j]=min(f[i][j],f[i-1][j-1]+1); 21 } 22 } 23 24 printf("%d\n",f[n][m]); 25 return 0; 26 }