题解【AcWing902】最短编辑距离
经典的最长公共子序列模型。
我们设 \(dp_{i,j}\) 表示 \(a_{1...i}\) 与 \(b_{1...j}\) 匹配上所需的最少操作数。
考虑删除操作,我们将 \(a_i\) 删除后 \(a_{1...i}\) 就与 \(b_{1...j}\) 匹配上了,说明原来 \(a_{1...i-1}\) 与 \(b_{1...j}\) 就是匹配上的,转移方程就是 \(dp_{i,j}=dp_{i-1,j}+1\)。
插入操作与删除操作同理,转移方程是 \(dp_{i,j}=dp_{i,j-1}+1\)。
考虑替换操作,
- 如果 \(a_i=b_j\),则 \(dp_{i,j}=dp_{i-1,j-1}\)。
- 如果 \(a_i\ne b_j\),则 \(dp_{i,j}=dp_{i-1,j-1}+1\)。
转移时这 \(3\) 种情况取 \(\min\) 即可。
边界条件: \(dp_{i,0}=i\),\(dp_{0,i}=i\)。
#include <bits/stdc++.h>
using namespace std;
int n, m, ans, dp[1003][1003];
char a[1003], b[1003];
int main()
{
scanf("%d%s", &n, a + 1);
scanf("%d%s", &m, b + 1);
for (int i = 1; i <= n; i+=1) dp[i][0] = i;
for (int i = 1; i <= m; i+=1) dp[0][i] = i;
for (int i = 1; i <= n; i+=1)
for (int j = 1; j <= m; j+=1)
{
dp[i][j] = min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);
if (a[i] == b[j]) dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
else dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1);
}
cout << dp[n][m] << endl;
return 0;
}
题解【AcWing902】最短编辑距离的更多相关文章
- POJ_3356——最短编辑距离,动态规划
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离
斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...
- [LeetCode] 72. Edit Distance(最短编辑距离)
传送门 Description Given two words word1 and word2, find the minimum number of steps required to conver ...
- POJ 3356(最短编辑距离问题)
POJ - 3356 AGTC Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Desc ...
- leetCode题解寻找最短字符路径
1.题目描述 2.分析 最简单的方案,对每一个字符,向两边寻找. 3.代码 vector<int> shortestToChar(string S, char C) { vector< ...
- acwing 902. 最短编辑距离
地址 https://www.acwing.com/problem/content/904/ 给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有: 删除–将字符串A中的某个字符删除. ...
- 【CJOJ1644】【洛谷2758】编辑距离
题面 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: 皆为小 ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- 编辑距离算法详解:Levenshtein Distance算法
算法基本原理:假设我们可以使用d[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等 ...
随机推荐
- 普通版js运动框架
//获取样式 function getStyle(obj){ if(obj.currentStyle){ return obj.currentStyle[attr]; }else{ return ge ...
- pikachu-反序列化漏洞
1.序列化的概念(摘自pikachu平台的介绍) (1)序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $te ...
- 多线程笔记 - disruptor
disruptor 可以理解为一个生产消费的框架. 具体翻译教程: http://ifeve.com/disruptor-getting-started/ 这个框架从数据上看, 是很强大的. 号称1s ...
- absoulue与relative配合定位盒子居中问题
如何通过absoulue与relative配合把一个盒子或者是把2个div块同时放到页面中央部分?定位完成后为什么又需要margin-left与margin-top各往回走50%的长度,别忘记用z-i ...
- 07.JS对象-2
前言: 学习一门编程语言的基本步骤(01)了解背景知识(02)搭建开发环境(03)语法规范(04)常量和变量(05)数据类型(06)数据类型转换(07)运算符(08)逻辑结构(09)函数(10)对象1 ...
- Android中实现照片滑动时左右进出的动画的xml代码
场景 Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- js有关字符串拼接问题
我们经常写代码要遇见要拼接字符串,比如说我们要把 "yyy" 和一个动态数字拼接,接下来我们怎么办? 其实我们都会想到直接用“yyy” + 一个数字不就可以了吗? 对的, ...
- Spring boot2.0学习笔记(一)
学习环境: jdk1.8 (Spring Boot 推荐jdk1.8及以上): java version "1.8.0_241" Maven 3.x (maven 3.2 以上版本 ...
- 在写论文的参考文献时,有的段落空格很大,有的段落则正常,原因及解决方法(wps)
下图是一段原始的参考文献,可以看出第一行的空格很大: 原因: 当一个词占不下时,自动将单词移动到下一行,但是这一行又有很多字符,因此这时,软件会将空闲的位置用空白字符填满.第一行有两个空白字符,因此将 ...
- [Python] 前程无忧招聘网爬取软件工程职位 网络爬虫 https://www.51job.com
首先进入该网站的https://www.51job.com/robots.txt页面 给出提示: 找不到该页 File not found 您要查看的页已删除,或已改名,或暂时不可用. 请尝试以下操作 ...