编辑距离 dp
2017-06-07 15:44
211 查看
评测
f[i][j]表示a中前i个字符转化为b中前j个字符最短编辑距离。结果就应是f[l1][l2]
赋初值:a串空时,对应b中j个字符时最短距离就是j(插入j个),f[0][i]=i;(i<=l2)
同理,f[i][0]=i;(i<=l1)
转移方程:
说明:
f[i][j]表示a中前i个字符转化为b中前j个字符最短编辑距离。结果就应是f[l1][l2]
赋初值:a串空时,对应b中j个字符时最短距离就是j(插入j个),f[0][i]=i;(i<=l2)
同理,f[i][0]=i;(i<=l1)
转移方程:
if(a[i]==b[j]) f[i][j]=f[i-1][j-1]; else f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
说明:
f[i-1][j-1]+1 , 在a[i-1]后面插入b[j] f[i-1][j]+1 , 删除a[i] f[i][j-1]+1,在a[i]后面插入b[j](a[i]与b[j-1]对应)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[2009][2009]; char a[2009],b[2009]; int main() { scanf("%s",a+1); scanf("%s",b+1); int l1=strlen(a+1),l2=strlen(b+1); for(int i=1;i<=l1;i++) f[i][0]=i; for(int i=1;i<=l2;i++) f[0][i]=i; for(int i=1;i<=l1;i++) for(int j=1;j<=l2;j++){ if(a[i]!=b[j]) f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1; else f[i][j]=f[i-1][j-1]; } printf("%d",f[l1][l2]); return 0; }
相关文章推荐
- EOJ 2857:编辑距离(DP)
- codeforces 56D Changing a String (dp编辑距离)
- POJ 3356 AGTC 最短编辑距离 DP
- Codeforces 67C Sequence of Balls 编辑距离 dp
- 最短编辑距离算法详解【DP】
- 简单DP【p2758】编辑距离
- HDU 4323——Magic Number——————【dp求编辑距离】2012——MUT——3
- Codevs 2598 编辑距离问题 dp
- SDUT 1225-编辑距离(串型dp)
- 【51Nod】1183 - 编辑距离(dp & 编辑距离)
- DP求两个字符串的编辑距离
- POJ 3356 AGTC(经典DP最短编辑距离)
- HDU 4323 编辑距离DP
- LeetCode:Edit Distance(字符串编辑距离DP)
- 51Nod 编辑距离 DP+滚动数组
- NOJ 1224 编辑距离问题 (线性dp 分类)
- 【经典dp】n数填m空,括号序列取第k项,最长非降序列计数及枚举,最短编辑距离
- 51Nod 1183 编辑距离 dp
- hdu4323magic number【编辑距离dp】
- LeetCode刷题 | 72. Edit Distance 难题 编辑距离dp