DP编辑距离
俄罗斯科学家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;
#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编辑距离的更多相关文章
- 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...
- [dp]编辑距离问题
https://www.51nod.com/tutorial/course.html#!courseId=3 转移方程: 注意如何对齐的. 这个算法的特点是,S和T字符串左边始终是对齐的.为了更好地理 ...
- POJ3356 – AGTC(区间DP&&编辑距离)
题目大意 给定字符串X和Y,可以对字符串进行一下三种操作: 1.删除一个字符 2.插入一个字符 3.替换一个字符 每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少? 题解 定义dp[ ...
- 经典dp 编辑距离
给定两个字符串S和T,对于T我们可以进行三种操作 (1)在任意位置增加字符 (2)删除字符 (3)替换字符 问最少多少次能把T变成S? 设f(i,j)是S的前i位和T的前j位对齐的最小花费 接下来分析 ...
- 51nod 1183 编辑距离(dp)
题目链接:51nod 1183 编辑距离 #include<cstdio> #include<cstring> #include<algorithm> using ...
- Codeforces 56D Changing a String 编辑距离 记忆dp
主题链接:点击打开链接 编辑距离.,== 一边dp虽然录制前体累,,依然是dp #include<iostream> #include<cstdio> #include< ...
- POJ 3356 AGTC(DP求字符串编辑距离)
给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案 ...
- (编辑距离问题 线性DP) nyoj1431-DNA基因鉴定
题目描述: 我们经常会听说DNA亲子鉴定是怎么回事呢?人类的DNA由4个基本字母{A,C,G,T}构成,包含了多达30亿个字符.如果两个人的DNA序列相差0.1%,仍然意味着有300万个位置不同,所以 ...
- HDU 4323 Magic Number(编辑距离DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4323 题意: 给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个 ...
随机推荐
- 转:Why SeaJS
原文地址:http://chaoskeh.com/blog/why-seajs.html Why SeaJS 前言 本文主要面向刚接触 SeaJS 的同学.文章会先提出传统 Javascript 开发 ...
- WPF Image控件使用本地图片
BitmapImage bi = new BitmapImage(); // BitmapImage.UriSource must be in a BeginInit/EndInit block. b ...
- 【转】class卸载、热替换和Tomcat的热部署的分析
这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理.一 class的热替换ClassLoader中重要的方法 loadClass ...
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- TCP程序设计
在Java中使用Socket(套接字)完成TCP程序的开发,使用此类可以方便地建立可靠的.双向的.持续的.点对点的通信连接. 在Socket的程序开发中,服务器端使用ServerSoc ...
- Carath\'eodory 不等式
(Carath\'eodory 不等式) 利用 Scharwz 引理及线性变换, 证明: 若函数 $f(z)$ 在圆 $|z|<R$ 内全纯, 在 $|z|\leq R$ 上连续, $M(r)$ ...
- Note++ 的快捷
Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): Ctrl+ ...
- AD按键-矩阵按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- HTTP Get请求URL最大长度
各浏览器HTTP Get请求URL最大长度并不相同,几类常用浏览器最大长度及超过最大长度后提交情况如下: IE6.0 :url最大长度2083个字符,超过最大长度后无法提 ...
- java网络编程之TCP实例
Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgr ...