首页 > 其他分享 >洛谷题单指南-动态规划2-P2758 编辑距离

洛谷题单指南-动态规划2-P2758 编辑距离

时间:2024-04-25 20:11:28浏览次数:30  
标签:指南 初始化 int 洛谷题 P2758 字符串 操作 dp

原题链接:https://www.luogu.com.cn/problem/P2758

题意解读:对a字符串最少操作几次可以变成b字符串,看似无从下手,可以从内部递推关系着手。

解题思路:

设dp[i][j]表示将a字符串1~i变成b字符串1~j的最少操作次数,字符串下标从1开始。

如何思考递推?可以从最后一步为切入点!最后一步对a[i]的操作有三种可能:

1、插入操作

在a[i]后面插入一个元素使得a等于b,前提是a的1~i和b的1~j-1已经相等,所以有dp[i][j] = dp[i][j-1] + 1

2、删除操作

把a[i]删除使得a等于b,前提是a的1~i-1已经与b的1~j相等,所以有dp[i][j] = dp[i-1][j] + 1

3、修改操作

a[i] != b[j]时,如果只把a[i]修改为b[j]就可以使得a等于b,前提是a的1~i-1已经与b的1~j-1相等,所以有dp[i][j] = dp[i-1][j-1] + 1

a[i] == b[j]时,最后一步都不需要修改,只要a的1~i-1已经与b的1~j-1相等就可以,所以有dp[i][j] = dp[i-1][j-1]

以上情况取min即可求得最少编辑次数。

注意:对dp[][]进行初始化

所有dp[i][0]都应该初始化为i,因为a的1~i变成空需要删i次;

所有dp[0][j]都应该初始化为j,因为a从空到b的1~j需要插入j次。

100分代码:

#include <bits/stdc++.h>
using namespace std;

string a, b;
int dp[2005][2005];

int main()
{
    cin >> a >> b;
    int m = a.size();
    int n = b.size();
    a = " " + a;
    b = " " + b;

    for(int i = 1; i <= m; i++) dp[i][0] = i; //把a前i个变成b前0个也就是""需要删i次
    for(int j = 1; j <= n; j++) dp[0][j] = j; //把a前0个变成b前j个要插入j次

    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            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] + 1);
            else dp[i][j] = min(dp[i][j], dp[i-1][j-1]);
        }
    }
    cout << dp[m][n]; 
    return 0;
}

 

标签:指南,初始化,int,洛谷题,P2758,字符串,操作,dp
From: https://www.cnblogs.com/jcwy/p/18158475

相关文章

  • Python 字符串格式化指南
    前言在Python中,字符串格式化是一种常见且重要的操作,用于将变量或值插入到字符串中,并控制输出的格式。本文将介绍几种常见的字符串格式化方法,帮助大家掌握在Python中有效地处理字符串的技巧。方法一:使用%操作符格式化字符串使用%操作符是一种传统的字符串格式化方法,可......
  • 洛谷题单指南-动态规划2-P1874 快速求和
    原题链接:https://www.luogu.com.cn/problem/P1874题意解读:一个数字字符串s,分解成几个整数,和为n,计算最少加号个数,也就是计算最少分解的整数个数-1。解题思路:此题虽然分类在动态规划,但数据量不大,DFS更加直观和易于理解,所以采用DFS暴搜+剪枝来解决。搜索思路是对数字字符串依次枚......
  • NumPy 1.26 中文官方指南(三)
    基础与用法NumPy基础知识原文:numpy.org/doc/1.26/user/basics.html这些文档阐明了NumPy中的概念、设计决策和技术限制。这是了解NumPy基本思想和哲学的好地方。数组创建对ndarrays进行索引使用NumPy进行I/O数据类型广播复制和视图结构化数组......
  • NumPy 1.26 中文官方指南(四)
    附加文件术语表原文:numpy.org/doc/1.26/glossary.html(n,)括号中跟着逗号的数字表示一个具有一个元素的元组。尾随逗号将一个元素元组与括号n区分开。-1在维度入口中,指示NumPy选择长度,以保持数组元素总数不变。>>>np.arange(12).reshape(4,-1).shape(4,3)在......
  • NumPy 1.26 中文官方指南(五)
    NumPy许可证原文:numpy.org/doc/1.26/license.htmlCopyright(c)2005-2023,NumPyDevelopers.Allrightsreserved.Redistributionanduseinsourceandbinaryforms,withorwithoutmodification,arepermittedprovidedthatthefollowingconditionsaremet:......
  • NumPy 1.26 中文官方指南(一)
    NumPy用户指南原文:numpy.org/doc/1.26/user/index.html本指南是一个概述,解释了重要特性;细节请参阅NumPy参考文档。入门指南什么是NumPy?安装NumPy快速入门NumPy:初学者的绝对基础基础知识和用法NumPy基础知识数组创建对ndarrays进行索引使......
  • NumPy 1.26 中文官方指南(二)
    NumPy1.26中文官方指南(二)NumPy:绝对初学者的基础知识原文:numpy.org/doc/1.26/user/absolute_beginners.html欢迎来到NumPy的绝对初学者指南!如果你有评论或建议,请不要犹豫联系我们!欢迎来到NumPy!NumPy(NumericalPython)是一个开源的Python库,几乎在每个科学和工程领域......
  • 洛谷题单指南-动态规划2-P4933 大师
    原题链接:https://www.luogu.com.cn/problem/P4933题意解读:求有多少个子序列可以组成等差序列解题思路:1、暴力DFS如果实在想不出动规的方法,对于n<=20的数据,可以DFS枚举所有子序列的子集,再判断是否是等差数列。30分代码:#include<bits/stdc++.h>usingnamespacestd;const......
  • Rabbit安装指南
    单机部署1、下载镜像方式一:在线拉取dockerpullrabbitmq:3-management方式二:从本地D:\lmdownload\mq.tar加载上传到虚拟机中后,使用命令加载镜像即可:dockerload-imq.tar2、安装执行下面的命令来运行MQ容器:dockerrun\-eRABBITMQ_DEFAULT_USER=root\-eRABBIT......
  • 洛谷题单指南-动态规划2-P1725 琪露诺
    原题链接:https://www.luogu.com.cn/problem/P1725题意解读:走过一系列格子之后,冰冻指数之和最大,相当于计算最大子序列的和。解题思路:设a[0~n]保存所有冰冻指数设dp[i]表示以第i号格子为终点所能获得的最大冰冻指数设j表示i的前一个格子,也就是从j可以移动到i已知i,则j的范围也......