俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念。

编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。 至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。

如果是: 
abcde 
acefg 
最优对齐状态是: 
abcde 
a  c  efg 
没有对上的列数是4,函数输出值为4。

状态转移方程是:d[i][j] = min{ d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+(a[i]==b[j]? 0:1) }

你看懂啦吗?

d[i][j]表示s1的前i个和s2的前j个字符相等。

初始状态为d[i][0]=i;d[0][i]=i;

(1)d[i-1][j]表示s1的前i-1个字符和s2的前j个字符已经相同啦,此时可以在s1的后面加上s2的最后一个字符或者把s2最后的字符去掉,即此时d[i][j]=d[i-1][j]+1;

(2)d[i][j-1]和(1)相同;

(3)d[i-1][j-1]时分两种情况

当s1[i]==s2[j]时,d[i][j]=d[i-1][j-1];

当s1[i]!=s2[j]时,d[i][j]=d[i-1][j-1]+1;

Hrbust 1284

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
char s1[],s2[];
int dp[][];
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>s1+>>s2+;
int l1=strlen(s1+);
int l2=strlen(s2+);
dp[][]=;
for(int i=;i<=l1;i++){
dp[i][]=i;
}
for(int i=;i<=l2;i++){
dp[][i]=i;
}
for(int i=; i<=l1; i++)
{
for(int j=; j<=l2; j++)
{if(s1[i]==s2[j])//if一定要紧接着for,顺序错啦就不对啦哦
dp[i][j]=dp[i-][j-];
else dp[i][j]=dp[i-][j-]+;
dp[i][j]=min(dp[i][j],dp[i][j-]+);
dp[i][j]=min(dp[i][j],dp[i-][j]+); }
}
cout<<dp[l1][l2]<<endl;
}
return ;
}

DP编辑距离的更多相关文章

  1. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  2. [dp]编辑距离问题

    https://www.51nod.com/tutorial/course.html#!courseId=3 转移方程: 注意如何对齐的. 这个算法的特点是,S和T字符串左边始终是对齐的.为了更好地理 ...

  3. POJ3356 – AGTC(区间DP&&编辑距离)

    题目大意 给定字符串X和Y,可以对字符串进行一下三种操作: 1.删除一个字符 2.插入一个字符 3.替换一个字符 每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少? 题解 定义dp[ ...

  4. 经典dp 编辑距离

    给定两个字符串S和T,对于T我们可以进行三种操作 (1)在任意位置增加字符 (2)删除字符 (3)替换字符 问最少多少次能把T变成S? 设f(i,j)是S的前i位和T的前j位对齐的最小花费 接下来分析 ...

  5. 51nod 1183 编辑距离(dp)

    题目链接:51nod 1183 编辑距离 #include<cstdio> #include<cstring> #include<algorithm> using ...

  6. Codeforces 56D Changing a String 编辑距离 记忆dp

    主题链接:点击打开链接 编辑距离.,== 一边dp虽然录制前体累,,依然是dp #include<iostream> #include<cstdio> #include< ...

  7. POJ 3356 AGTC(DP求字符串编辑距离)

    给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案 ...

  8. (编辑距离问题 线性DP) nyoj1431-DNA基因鉴定

    题目描述: 我们经常会听说DNA亲子鉴定是怎么回事呢?人类的DNA由4个基本字母{A,C,G,T}构成,包含了多达30亿个字符.如果两个人的DNA序列相差0.1%,仍然意味着有300万个位置不同,所以 ...

  9. HDU 4323 Magic Number(编辑距离DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4323 题意: 给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个 ...

随机推荐

  1. openstack(liberty): 简单网络连接图

    openstack起初的网络部分是和计算核心nova合在一起的,后来被拆分出来,独立成为一个模块, 现在名为Neutron. 本博文是学习记录,记录的是基于GRE tunnel技术的neutron和计 ...

  2. scala pattern matching

    scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...

  3. Linux下访问其他机器的共享

    1.如何查看其他机器上的共享列表? 解答:使用smbclient 客户端,在Linux机器上可以用来查看服务器上的共享资源,也可以向ftp一样,用户可以登陆samba服务器,也可以上传put和下载ge ...

  4. ettercap ARP dns 欺骗

    1.arp 这个简单,太熟了.略过1     2.dns   根据arp欺骗的步骤. 多了个etter.dns文件 找到它:locate etter.dns 进入后添加dns正向解析     启动,选 ...

  5. 剑指offer系列61---数组中的逆序对

    [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...

  6. SNM2无法编辑HostGroup项

    经常遇到SNM2的工具无法更新,无法编辑,或者加载急慢的情况.解决方法就是在SNM2重新添加Array,然后再重新登录试试

  7. 3D视觉差---原生js+css

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. SOA_环境安装系列4_Oracle SOA安装和环境搭建(案例)

    2015-01-02 Created By BaoXinjian

  9. PLSQL_性能优化系列04_Oracle Optimizer优化器

    2014-09-25 Created By BaoXinjian

  10. All_从PO - INV - AP - SLA - GL重要数据表和接口程式(概念)

    2014-07-09 Created By BaoXinjian