码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划--P2758 编辑距离

时间:2020-03-03 11:15:29      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:规划   family   strlen   包括   namespace   ret   位置   main   编辑   

*传送

动态规划最主要确定状态和转移方程,所以我的思路如下:

 

1.定义状态:

确定dp(i,j)代表字符串A的前i个字符(包括第i个)变为字符串B的前j个(包括第j个)需要多少步。而dp[l1][l2]就是我们所要找的答案。

 

2.转移方程:

*删:dp(i-1,j)+1 //字符串A的前i-1个字符变为字符串B的前j个需要多少步 【把字符串的第i个字符(最后一个)删除了】,删除需要一步因此加1

*添:dp(i,j-1)+1 //将B[j]字符加在A字符串的最后面即添加,同样可以理解为将B[j]字符删掉(因为不用再考虑了)。

//字符串A的前i个字符变为字符串B的前j-1个需要多少步 添加需要一步因此加1

*替:dp(i-1,j-1)+1 //字符串A和B的最后两个都相等了,因此都不用再考虑

//字符串A的前i-1个字符变为字符串B的前j-1个需要多少步 添加需要一步因此加1

*不变:dp(i-1,j-1)//字符串A和B的最后两个都相等,不考虑。

 

反观这道题,如果两个字符串当前位置上相同,就可以不变,如果不相同就需要进行三种操作,取一种最小的。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <cstring> 
 6 using namespace std;
 7 char s1[2005],s2[2005];
 8 long long dp[2005][2005];
 9 int main(){
10     scanf ("%s%s",s1+1,s2+1);
11     int l1=strlen(s1+1),l2=strlen(s2+1);
12     for (int i = 0;i <= l1;i++) dp[i][0]=i;
13     for (int i = 0;i <= l2;i++) dp[0][i]=i;
14     for (int i = 1;i <= l1;i++){
15         for(int j = 1;j <= l2;j++){
16             if (s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1];
17             else dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
18         }
19     }
20     cout<<dp[l1][l2];
21     return 0;
22 }

 

动态规划--P2758 编辑距离

标签:规划   family   strlen   包括   namespace   ret   位置   main   编辑   

原文地址:https://www.cnblogs.com/very-beginning/p/12400724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!