线性dp:编辑距离
编辑距离
- 本题与力扣72.编辑距离题意一样,阅读完本文可以尝试leetcode72.
力扣题目链接
题目叙述
输入两个字符串a,b。输出从字符串a修改到字符串b时的编辑距离
输入
NOTV
LOVER
输出
4
题目解释:
动态规划思路
- 这个问题显然是一个最优解问题,我们可以考虑动态规划的思路,那么我们使用动态规划的思路,要想得到最优解问题,那么我们必须要先考虑子问题。
- 子问题:我们先考虑
a[1,2...i]
到b[1,2....j]
的编辑距离
状态变量的含义
- 设立一个
dp数组
,作为我们的状态变量dp[i][j]
表示以从a[1...i]
到b[1....j]
的编辑距离
递推公式
- 设立完状态变量,那么我们就进入了递推公式的推导
- 1.若
a[i]
=b[j]
,那么dp[i][j]==dp[i-1][j-1]
- 2.
a[i]!=b[j]
- 1.若
- 那么我们就很容易的推出我们的递推公式:
dp[i][j]
=dp[i-1][j-1]
(a[i]==b[j]
)dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1
)(a[i]!=b[j]
)
遍历顺序
- 显然是从上到下,从左到右。
初始化dp数组
边界条件:
f[i][0]=i
f[0][j]=j
对应的初始化代码如下:
m=strlen(a);
n=strlen(b);
for(int i=1;i<=m;j++) dp[i][0]=i;
for(int j=1;j<=n;j++) dp[0][j]=j;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];
else dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j])+1;
}
}
cout<<f[m][n];
举例打印dp数组
- 举例如下:
代码
- 最终实现代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char a[2005],b[2005];
int f[2005][2005];
int main(){
scanf("%s %s",a,b);
int la=strlen(a), lb=strlen(b);
for(int i=1;i<=la;i++) f[i][0]=i;
for(int i=1;i<=lb;i++) f[0][i]=i
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;j++)
if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1];
else f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;
printf("%d\n",f[la][lb]);
}
线性dp:编辑距离的更多相关文章
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 动态规划篇——线性DP
动态规划篇--线性DP 本次我们介绍动态规划篇的线性DP,我们会从下面几个角度来介绍: 数字三角形 最长上升子序列I 最长上升子序列II 最长公共子序列 最短编辑距离 数字三角形 我们首先介绍一下题目 ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
随机推荐
- Android系统源码的整编和单编
# Android系统源码的整编和单编 文章作者: 刘望舒 文章链接: http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html 前言 很多时 ...
- Meilisearch 安装和使用教程
如今搜索功能已成为几乎所有应用不可或缺的一部分.无论是电商平台.内容管理系统,还是企业内部知识库,用户都期待能够快速.准确地找到他们需要的信息.然而,传统的搜索解决方案往往面临着诸多挑战:响应速度慢. ...
- VUE商城项目 -权限功能 - 手稿
- VUE手稿1
- c 语言学习第五天
break 语句 在循环体中使用 break,可以跳出循环 打印 10 以内的数. #include<stdio.h> int main(){ int i,j = 20; for(i = ...
- LabVIEW图标编辑器中的文本变得模糊
问题详述 在LabVIEW图标编辑器中将文本添加到VI图标时,如果我将字体大小设置为小于10,文本会变得模糊.当字体大小设置为大于11时,文本会正常地显示,但是字体则变得太大而无法放入图标中. 真难看 ...
- 假期小结1学习安装VMware以及linux
学习VMware是一项使我能够创建和管理虚拟机的技能.VMware 是一家知名的虚拟化解决方案供应商,它提供了一系列工具和软件,使我能够在一台物理计算机上创建多个独立的虚拟环境. 首先,我获取了VMw ...
- macOS 常用键盘快捷键
macOS 常用键盘快捷键大全 - 最值得你记住的 Mac 常用快捷键组合 Pertim 与 Windows 的差异 一切开始前,我们先来认识一下苹果 Mac 键盘上几个陌生的按键,比如 ⌘ (Com ...
- linux常用命令(每日积累)
linux查看应用程序的进程号和端口号 lsof -i :port,查看指定端口运行的程序,同时还有当前连接. netstat -nupl (UDP类型的端口)netstat -ntpl (TCP ...
- 什么是web3 为什么web3很重要
中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定.可靠的基础设施. 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为. Web3 是摆脱这一困境的方案. 不同于科技巨头垄断的传统互 ...