首页 > 其他分享 >线性dp:编辑距离

线性dp:编辑距离

时间:2024-08-23 20:27:59浏览次数:6  
标签:int 距离 编辑 2005 线性 strlen dp

编辑距离

  • 本题与力扣72.编辑距离题意一样,阅读完本文可以尝试leetcode72.
    力扣题目链接

题目叙述

输入两个字符串a,b。输出从字符串a修改到字符串b时的编辑距离

输入

NOTV
LOVER

输出

4

题目解释:

img

动态规划思路

  • 这个问题显然是一个最优解问题,我们可以考虑动态规划的思路,那么我们使用动态规划的思路,要想得到最优解问题,那么我们必须要先考虑子问题。
  • 子问题:我们先考虑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]

img

  • 那么我们就很容易的推出我们的递推公式:
    • 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数组

  • 举例如下:

img

代码

  • 最终实现代码如下:
#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]);
}

标签:int,距离,编辑,2005,线性,strlen,dp
From: https://www.cnblogs.com/Tomorrowland/p/18369792

相关文章

  • 计算机网络——TCP协议与UDP协议详解(下)
    一、TCP协议1.1TCP协议的报文TCP全称为"传输控制协议(TransmissionControlProtocol")。人如其名,要对数据的传输进行一个详细的控制。我们先看其报文格式,如下图:TCP报文由以下几个字段组成:源端口号和目标端口号:每个TCP连接都有一个源端口号和一个目标端口号。源端口号......
  • 代码实现WordPress主动推送及自动推送至百度搜索收录
    站长们辛辛苦苦写的文章,无非就是让百度收录,也可以帮助人,也可以给自己站或者帮人优化的站带来流量,今天就来发一篇关于wordprss主动推送给百度的方法;使用方法,U8格式放在wp当前模板functions.php里即可12345678910111213141516171819202122232425262......
  • AP5101C 6-100V 2A LED降压恒流型的线性调光驱动器 台灯手电筒与汽车灯方案
    产品描述AP5101C是一款高压线性LED恒流芯片,外围简单、内置功率管,适用于6-100V输入的高精度降压LED恒流驱动芯片。最大电流2.0A。AP5101C可实现内置MOS做2.0A,外置MOS可做3.0A的。AP5101C内置温度保护功能,温度保护点为130度,温度达到130度时,输出电流慢慢减小,达到保护芯片电路......
  • 阿里dataworks通过pyodps 3获取表元数据及质量稽核
    用途:本脚本的主要作用就是获取所属工作空间中表字段信息核心脚本:本逻辑主要需要五个核心脚本:00_task_meta_setup_time#用于创建表及设置odps的启动时间01_task_meta_fields_move#搬迁数据02_task_meta_tables#表元数据获取及数据量统计03_task_meta_fields_parallel......
  • QPointer、QScopedPointer、QSharedPointer、QWeakPointer
    QPointer、QScopedPointer、QSharedPointer、QWeakPointerQSharedPointer:std::shared_ptrQWeakPointer:std::weak_ptrQScopedPointer:std::unique_ptrQPointer:无STL等效项。QObject析构时为空。QPointer功能:一个“半自动”的指针包装器。通常情况下,我们在手动delete一......
  • 遷移Wordpress到新域名,新子域名
    1.0前言把Wordpress遷移到WordpressMultiSites的子域名,因此“All-in-OneWPMigrationandBackup”就需要付費VIP才支持遷移子域名。但用手動方法也可以實現遷移到子域名。延伸文章:Wordpress主題文章wordpress更改domain域名和數據庫連接2.0 “All-in-OneWPMigratio......
  • 线性dp:最长公共子序列
    最长公共子序列本文讲解的题与leetcode1143.最长公共子序列这题一样,阅读完可以挑战一下。力扣题目链接题目叙述:给定两个字符串,输出其最长公共子序列,并输出它的长度输入:ADABEC和DBDCA输出:DBC3解释最长公共子序列是DBC,其长度为3动态规划思路:我们这题先构建一个模......
  • 线性dp:最长公共子串
    最长公共子串本文讲解的题与leetcode718.最长重复子数组,题意一模一样,阅读完本文以后可以去挑战这题。力扣链接题目叙述:给定两个字符串,输出其最长公共子串的长度。输入ABACCBAACCAB输出3解释最长公共子串是ACC,其长度为3。与最长公共子序列的区别公共子串:字符必须......
  • 线性代数
    看了很多题目,个人觉得现阶段以考察矩阵乘法(快速幂)、高斯消元法求线性方程组的解、矩阵优化dp、一些trick(线段树维护矩阵,kmp套矩阵等)以及矩阵自身性质的深层次运用为主。P1962斐波那契数列应该是典题。从这道题我们可以发现矩阵优化dp的最有效办法是手模,所以此类题目一般......
  • dp
    前情提要dp专题复习树形dp其实对我来说树形dp会比序列dp学得好一些,因为树是有一个具体形态的东西,推式子是比较具象的。其实序列就是把树拍平在数轴上去dp的,只要考虑到这一点,画出dp的转移图,式子就可以呼之欲出了。不套路的dp考验人类智慧的时刻到了!P1352没有上司......