首页 > 其他分享 >洛谷P2758编辑距离超详注解

洛谷P2758编辑距离超详注解

时间:2024-08-13 20:59:46浏览次数:16  
标签:洛谷 int 超详 P2758 个字符 字符串 sb dp 赋值

注:本蒟蒻第一篇题解

本文亦发表于洛谷博客

题目跳转

题目大意


用最少的字符操作次数,将字符串 A 转换为字符串 B。字符操作为:
1. 删除一个字符;
2. 插入一个字符;
3. 将一个字符改为另一个字符。


代码思路


本题很明显用的是DP

1. 赋值

将dp数组的值赋值到最大

2. 特殊赋值


对关于字符串a的dp数组的特殊值进行赋值

        字符串a的前i个字符变为字符串b的前0个字符的最短编辑距离为i(全部都删除)

对关于字符串b的dp数组的特殊值进行赋值

        字符串a的前0个字符变为字符串b的前i个字符的最短编辑距离为i(全部都增加与字符串b相同的字符)

3.状态转移

转移有三种(若两者相同,就不用换了): 
1. dp[i-1][j]->dp[i][j],插入即可,即dp[i][j]=dp[i-1][j]+1; 
2. dp[i][j-1]->dp[i][j],删除即可,即dp[i][j]=dp[i][j-1]+1; 
3. dp[i-1][j-1]->dp[i][j],要把sa[i-1]换成sb[j-1],即dp[i][j]=dp[i-1][j-1]+1。 

合到一起就变成dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1

参考代码
 

/*请勿copy*/
#include<bits/stdc++.h>//万能头
#define int long long//可加可不加
using namespace std;//用cin,cout必写
const int maxn=2e3+1;//字符串最大长度(记得要多加一点)
string sa,sb;//定义字符串
int alen,blen;//记录字符串长度
int dp[maxn][maxn];//dp[i][j]代表字符串a的前i个字符变为字符串b的前j个字符的最短编辑距离
signed main(){//主程序
    cin>>sa>>sb;//输入
    alen=sa.size();//记录字符串a的长度
    blen=sb.size();//记录字符串b的长度
    memset(dp,0x3f,sizeof dp);//初始化,将dp数组的值赋值到最大
    //对关于字符串a的dp数组的特殊值进行赋值
    for(int i=0;i<=alen;i++){//注意字符串首位是从下标0开始
        dp[i][0]=i;//字符串a的前i个字符变为字符串b的前0个字符的最短编辑距离为i(全部都删除)
    }
    //对关于字符串b的dp数组的特殊值进行赋值
    for(int i=0;i<=blen;i++){//同上
        dp[0][i]=i;//字符串a的前0个字符变为字符串b的前i个字符的最短编辑距离为i(全部都增加与字符串b相同的字符)
    }
    for(int i=1;i<=alen;i++){//同上(i=0时已经处理过)
        for(int j=1;j<=blen;j++){//同上(j=0时也已经处理过)
            if(sa[i-1]==sb[j-1]) dp[i][j]=dp[i-1][j-1];//若两者相同,就不用换了
            else dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;//转移有三种: 1.dp[i-1][j]->dp[i][j],插入即可,即dp[i][j]=dp[i-1][j]+1; 2.dp[i][j-1]->dp[i][j],删除即可,即dp[i][j]=dp[i][j-1]+1; 3.dp[i-1][j-1]->dp[i][j],要把sa[i-1]换成sb[j-1],即dp[i][j]=dp[i-1][j-1]+1。 合到一起就变成dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1
        }
    }
    cout<<dp[alen][blen];//输出整个字符串的最短编辑距离
    return 0;//结束程序
}

标签:洛谷,int,超详,P2758,个字符,字符串,sb,dp,赋值
From: https://blog.csdn.net/wl_zhanglinhao/article/details/141000015

相关文章

  • 洛谷美化教程
    洛谷那界面太丑了,给大家推荐美化教程edge用户下载篡改猴。Google自行摸索。。。下载UP给的扩展包密码CSDN私聊edge访问:thisgoogle访问:this注意:edge用户请打开拖拽下载的文件进入安装扩展edge和Google会提示安装篡改猴生效图片:背景颜色可打开篡改猴自行修改......
  • 洛谷题单指南-常见优化技巧-P1638 逛画展
    原题链接:https://www.luogu.com.cn/problem/P1638题意解读:在n个数中,选出a、b两个端点,使得a~b之间不同的数字为m,且b-a最小。解题思路:要寻找最小的包括所有数字的区间,可以采用双指针算法1、设i,j分别是左右指针2、如果当前区间内不同数字个数不到m,j往后移3、记录数字个数到m时......
  • [YM]模板-单链表(超详细简洁模板)
    概念:链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳,复杂度几乎是O(n)但其还是有很大的重要性是数据结构的开端模板:题目概述:相信大家对于单链表的操作已经游刃有余了,我们知道,对于一个单......
  • 洛谷 P4305 不重复数字——题解
    洛谷P4305题解传送锚点摸鱼环节[JLOI2011]不重复数字题目描述给定\(n\)个数,要求把其中重复的去掉,只保留第一次出现的数。输入格式本题有多组数据。第一行一个整数\(T\),表示数据组数。对于每组数据:第一行一个整数\(n\)。第二行\(n\)个数,表示给定的数。输出格......
  • 软件著作权申请教程(超详细)(2024新版)软著申请
        目录一、注册账号与实名登记二、材料准备三、申请步骤1.办理身份2.软件申请信息3.软件开发信息4.软件功能与特点5.填报完成一、注册账号与实名登记    首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个人】的身份。中国版权保护......
  • ssh 和 git 教程(1万字超详细)
    SSH(SecureShell)是一种用于安全地访问和管理远程计算机的网络协议。它通过加密的连接在不安全的网络上提供安全的通信方式。SSH常用于远程登录、远程命令执行以及安全数据传输。当我们使用Git进行版本控制时,经常需要将代码推送到远程仓库(例如GitHub、GitLab、Bitbucket等)或......
  • C语言编译和链接超详解
    文章目录1.翻译环境和运行环境2.翻译环境2.1预处理(预编译)2.2编译2.2.1词法分析2.2.2语法分析2.2.3语义分析2.3汇编2.4链接3.运行环境1.翻译环境和运行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代......
  • 从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程
    从零开始搭建Kubernetes集群从零开始搭建Kubernetes(K8s)集群部署方式准备工作(所有节点)1.关闭防火墙2.关闭SELinux3.关闭Swap分区4.设置主机名5.配置网络设置6.安装IPVS(可选,非必须)安装Docker、kubeadm、kubelet和kubectl1.安装Docker2.安装cri-docke......
  • 洛谷 P4556 雨天的尾巴之线段树合并模板
    洛谷P4556题解传送锚点摸鱼环节[Vani有约会]雨天的尾巴/【模板】线段树合并题目背景深绘里一直很讨厌雨天。灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以......
  • 调用百度api的情绪分析网站(Flask+HTML)搭建(附超详细代码)
      概要:本文调用多个api接口来进行不同类型(数据文件)情绪分析处理,并利用flask框架与前端联调将自己的情绪分析项目部署到服务器端。。实现下图功能。(第一篇文章小小记录下,要是有帮助就点个赞叭)一.免费申请百度api并调用首先在百度智能云中申请免费的自然语言处理api选......