AcWing 902. 最短编辑距离(动态规划)

2023-11-03

这个题也做到过,貌似是鹅厂的压轴题,用三种方式编辑两个字符串的相似距离。

题目

集合:将a[1~ j]变成b[1~ j]的操作方式
属性:min

考虑过程比较难,从末尾开始考虑,三种操作方式上着手。

以下来自AcWing网友整理,很细致
有三种操作,所以有三个子集
ok子集划分完了
考虑状态转移的时候
先考虑如果我没有进行这个操作应该是什么状态
然后考虑你进行这一步操作之后会对你下一个状态造成什么影响
然后再加上之前状态表示中你决策出来的那个DP属性
这样就可以自然而然地搞出来转移方程啦

1)删除操作:把a[i]删掉之后a[1i]和b[1j]匹配
所以之前要先做到a[1(i-1)]和b[1j]匹配
f[i-1][j] + 1
2)插入操作:插入之后a[i]与b[j]完全匹配,所以插入的就是b[j]
那填之前a[1i]和b[1(j-1)]匹配
f[i][j-1] + 1
3)替换操作:把a[i]改成b[j]之后想要a[1i]与b[1j]匹配
那么修改这一位之前,a[1(i-1)]应该与b[1(j-1)]匹配
f[i-1][j-1] + 1
但是如果本来a[i]与b[j]这一位上就相等,那么不用改,即
f[i-1][j-1] + 0

好的那么f[i][j]就由以上三个可能状态转移过来,取个min

作者:Shadow
链接:https://www.acwing.com/solution/AcWing/content/5607/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


需要注意初始化,就是比如a字符串n位,b0位,那么永远是需要n次操作。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(System.out);
    static int N = 1010, n, m;
    static int f[][] = new int[N][N];
    static char[] a, b;

    public static void main(String[] args) throws IOException {
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        String aa = br.readLine();
        a = aa.toCharArray();

        s = br.readLine().split(" ");
        m = Integer.parseInt(s[0]);
        String bb = br.readLine();
        b = bb.toCharArray();

        for (int i = 0; i <= n; i++) f[i][0] = i;
        for (int i = 0; i <= m; i++) f[0][i] = i;

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++) {
                f[i][j] = Math.min(f[i - 1][j] + 1, f[i][j - 1] + 1);
                if (a[i - 1] == b[j - 1]) f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]);
                else f[i][j] = Math.min(f[i][j], f[i - 1][j - 1] + 1);
            }
        pw.println(f[n][m]);

        pw.flush();
        pw.close();
        br.close();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AcWing 902. 最短编辑距离(动态规划) 的相关文章

  • Acwing 291. 蒙德里安的梦想

    题目分析 摆放方块的时候 先放横着的 再放竖着的 总方案数等于只放横着的小方块的合法方案数 如何判断 当前方案数是否合法 所有剩余位置能否填充满竖着的小方块 可以按列来看 每一列内部所有连续的空着的小方块需要是偶数个 这是一道动态规划的题目
  • 模糊匹配之——BK树与拼写纠正

    介绍 拼写纠错功能常常出现在比较高级的文本编辑应用中 例如大家熟知的word 高级一点的IDE例如Jet Brains系列 在一些在线翻译上 也有自动校正拼写的功能 例如谷歌翻译 原理 拼写纠正的实现方式有多种 这里使用的是一种名为BK树的
  • LeetCode312. 戳气球 (分治,记忆化搜索,动态规划)

    LeetCode312 戳气球 解题思路 记忆化搜索 动态规划 解题思路 官方题解 参考题解 核心思想 由于戳气球的操作会导致两个气球从不相邻变成相邻 使得后续操作难以处理 于是我们倒过来看这些操作 将全过程看成每次添加一个气球 solve
  • 动态规划练习一 14:怪盗基德的滑翔翼

    描述 怪盗基德是一个充满传奇色彩的怪盗 专门以珠宝为目标的超级盗窃犯 而他最为突出的地方 就是他每次都能逃脱中村警部的重重围堵 而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼 有一天 怪盗基德像往常一样偷走了一颗珍贵的钻石 不料却被柯
  • 国王和金矿问题

    国王和金矿问题 描述 有一个国家发现了max n座金矿 参与挖矿工人的总数是max people人 每座金矿的黄金储量不同为一维数组gold 需要参与挖掘的工人数也不同为一维数组peopleNeed 每座金矿要么全挖 要么不挖 不能派出一半
  • LeetCode64. 最小路径和

    题目大意 求出从网络左上角到右下角的一条代价最小的路径和 题目分析 使用动态规划 求出左上角到网络中每个点的代价最小路径和 假设当前要求的是point i j 点 那么它的值就应该是从左上角到它上面那个点point i 1 j 的路径和 与
  • 力扣动态规划专题(一)背包理论基础 基础动规题 动规注意点 步骤及C++实现

    文章目录 动态规划 509 斐波那契数 五步骤 代码 70 爬楼梯 五步骤 代码 746 使用最小花费爬楼梯 五步骤 代码 扩展 62 不同路径 动态规划 数论 63 不同路径 II 五步骤 代码 343 整数拆分 五步骤 代码 96 不同
  • leetcode-动态规划【背包问题】

    背包问题篇 基础背包 416 分割等和子集 1049 最后一块石头的重量ii 494 目标和 474 一和零 完全背包 518 零钱兑换ii 377 组合总和iv 70 爬楼梯 322 零钱兑换 279 完全平方数 139 单词拆分 多重背
  • 动态规划算法解决背包问题(Java实现)

    文章收藏的好句子 你在书本上花的任何时间 都会在某一个时刻给你回报 目录 1 动态规划算法的概述 2 背包问题 3 动态规划算法解决背包问题 3 1 不可重复装入商品 3 2 思路分析 1 动态规划算法的概述 1 动态规划算法的思想是 将大
  • 备战2023蓝桥国赛-饼干

    题目描述 解析 这道题我想了很多种解决方法 但无一例外都失败了 实在是按照常规线性DP的思路真的想不出来 看了题解之后才知道它是分为三步解决这个问题的 第一步 缩小最优解的范围 先用贪心将最优解缩小到某个较小的范围内 再DP求出精确的最优解
  • 洛谷P1028 [NOIP2001 普及组] 数的计算 —— 简单DP+双指针优化

    This way 题意 给出自然数 n n n 要求按如下方式构造数列 只有一个数字 n n n 的数列是一个合法的数列 在一个合法的数列的末尾加入一个自然数 但是这个自然数不能超过该数列最后一项的一半 可以得到一个新的合法
  • 滑雪(记忆化搜索)

    题目 题解 记忆化搜索模板题 记忆化搜索的核心 本质是带剪枝的深搜 当某点的dp已赋值时 返回该值 其他情况进行深度搜索 模板 dfs u点 if u点的 dp 已经有值了 return u点的 dp 值 else 说明第一次到达u 则为u
  • 华为od机考真题-HJ17坐标移动(中等)

    data input l r 0 0 for ad in data split ad
  • OD机试题目【计算网络信号】

    网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网络信号值 注意 网络信号可以绕过阻隔物 array m n 的二维数组代表网格地图 array i j 0代表i行j列是空旷位置 array i j x x
  • 《算法图解》第九章动态规划学习心得

    1 背包问题 动态规划先解决子问题 再逐步解决大问题 每个动态规划都从一个网格开始 背包问题的网格如下 网格最初是空的 动态规划就是逐步将网格填满 吉他行 第一个单元格表示背包的容量为1磅 吉他的重量也是1磅 这意味着它能装入背包 因此这个
  • 【LeetCode75】第五十九题 第N个泰波那契数

    目录 题目 示例 分析 代码 题目 示例 分析 题目顾名思义 让我们求出第N个泰波那契数 也就是除了开头三个数之外 第四个数开始就是等于前三个数之和 不要和斐波那契数弄混了 斐波那契是前两个数的和 泰波那契是前三个数的和 也就是说当前数 我
  • Python之动态规划

    序言 最近在学习python语言 语言有通用性 此文记录复习动态规划并练习python语言 动态规划 Dynamic Programming 动态规划是运筹学的一个分支 是求解决策过程最优化的过程 20世纪50年代初 美国数学家贝尔曼 R
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 算法设计与实现--动态规划篇

    什么是动态规划算法 动态规划算法是一种求解复杂问题的方法 通过将原问题分解为相对简单的子问题来求解 其基本思想是将待求解的问题分解为若干个子问题 阶段 按顺序求解子阶段 前一子问题的解 为后一子问题的求解提供了有用的信息 在求解任一子问题时
  • 【算法】【动规】最长递增子序列

    跳转汇总链接 动态规划算法汇总链接 2 1 最长递增子序列 题目链接 给你一个整数数组 nums 找到其中最长严格递增子序列的长度 子序列是由数组派生而来的序列 删除 或不删除 数组中的元素而 不改变其余元素的顺序 例如 3 6 2 7 是

随机推荐

  • pytorch中torchvision.utils包下的save_image函数

    雷郭出品 函数的用途 将NCHW的tensor以网格图的形式存储到硬盘中 该图也叫做雪碧图sprite image 如下图所示 将多张图以网格的形式拼凑起来 每张图的大小是28 28 单通道 那宽高如何确定 我们可以来看看该函数的源码 de
  • K8S的DaemonSet控制器

    1 什么是DaemonSet DaemonSet确保全部 或者一些 Node上运行一个pod的副本 当有Node加入集群时 也会为他们新增一个pod 当有Node从集群移除时 这些pod也会被回收 删除DaemonSet将会删除它创建的所有
  • 牛客剑指offer之【JZ13 机器人的运动范围】

    1 题目 2 示例解读 示例1输入的第一个参数为1 即threshold的值 第二 三个参数分别为2 3 即一个二行三列的格子 返回行坐标和列坐标的数位之和大于 threshold 的格子数 为3 具体如下 3 解题思路 根据题目分析可得
  • Android之使用PackageManager取得程序的包名、图标等

    图 Model代码 public class AppInfo private String appLabel private Drawable appIcon private Intent intent private String pkg
  • vue3中使用vuex状态管理

    vue3和vue2中使用vuex 基本一样 首先是配置vuex store下 index js为总文件 import createStore from vuex import actions from actions import gett
  • 如何在DIrectFB显示BMP图片

    下载directfb extra 编译安装好就行了 里面有bmp文件接口 接下来显示bmp和显示png方法是一样的
  • Android优雅的进行混淆——使用@Keep注解

    转自 https www jianshu com p be7ec1819d2f 综述 对于ProGuard工具想必我们都不陌生 它能够通过移除无用代码 使用简短无意义的名称来重命名类 字段和方法 从而能够达到压缩 优化和混淆代码的目的 最终
  • Centos7安装使用Docker

    Centos7安装使用Docker 系统环境与软件版本说明 名称 详情 系统环境 CentOS Linux release 7 5 1804 Core Docker docker ce 18 06 1 ce 3 el7 Docker安装 官
  • 电子学会 青少年软件编程等级考试 C语言 8 级

    8级 2022 9 01 道路 POJ 1724 ROADS POJ 1724 ROADS 望穿秋水 晴的博客 CSDN博客 roads daima POJ No 3352 道路建设 Road Construction POJ No 335
  • 抖音seo账号矩阵源码系统

    1 开通多个抖音账号 并将它们归纳为一个账号矩阵系统 2 建立一个统一的账号管理平台 以便对这些账号进行集中管理 包括账号信息 内容发布 社区交互等 3 招募专业的运营团队 对每个账号进行精细化运营 包括内容制作 社区互动 数据分析等 4
  • c语言输入姓名输出姓和名_C输入和输出

    c语言输入姓名输出姓和名 Input means to provide the program with some data to be used in the program and Output means to display dat
  • Eclipse注释中文格式没对齐

    遇到的问题 一格式化 号就出现以下情况 老是对不齐 解决的办法 java code style formatter edit 去掉Enable block comment formatting复选框 然后把下面的数字调大一点就可以了 如果不
  • FPGA实现ADC采样芯片ADS8688的采样

    在电机控制中 一般需要对电机三相电流Iu Iv Iw采样 并通过采样补偿 坐标变换等将采样电流反馈值输出到电流环闭环控制 中 除此之外 还需要对母线电压 驱动器温度进行采样 监控采样值 以此为根据 来对运行中的驱动器做过压 过温保护 ADS
  • FPGA时序约束(一)基本概念入门及简单语法

    文章目录 一 建立时间和保持时间是什么 二 时序分析分类 三 时钟约束方法 3 1 时钟约束 3 2 输入延时约束 3 3输出延时约束 3 4时序例外 四 时序约束语法补充 文章目前大部分参考明德扬时序约束 只是一个学习总结 侵权删 原文链
  • mysql入坑之路(12)windows 部署MySQL,tar方式手动添加服务进行程序管理

    1 CTRL R 打开运行窗口 输入regedit点击确定打开注册表编辑器 2 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet Services 3 新建项 MYSQL服务 4 添加项内参数和值
  • 深度学习模型训练tips&典型报错解决方案(持续更新)

    一 Pytorch页面文件太小 无法完成操作 1 可能是python安装根目录磁盘虚拟内存不足 应增大虚拟内存 虚拟内存默认为C盘的2GB 2 可能是对应磁盘空间不足 需清理磁盘空间 3 如使用win10系统 Datalodar可能出现问题
  • PAT C入门题目-7-122 A-B (20 分)

    7 122 A B 20 分 本题要求你计算A B 不过麻烦的是 A和B都是字符串 即从字符串A中把字符串B所包含的字符全删掉 剩下的字符组成的就是字符串A B 输入格式 输入在2行中先后给出字符串A和B 两字符串的长度都不超过10 4 并
  • group by和select的使用

    GROUP BY的用法 1 group by概述 简单来说 将数据库的数据用 by 后面接的规则进行分组 即将一个大数据库分成一个个相同类型数据在一起的小区域 2 group by的语法 SELECT column name functio
  • idea Context: local file . file is included in 3 contexts

    最近不知道咋滴 我的好几个项目的applicationContext xml文件的头部都会出现这样的一个提示 看着很不舒服 删掉facts后 再重新加入 结果是这样就没有提示了
  • AcWing 902. 最短编辑距离(动态规划)

    这个题也做到过 貌似是鹅厂的压轴题 用三种方式编辑两个字符串的相似距离 题目 集合 将a 1 j 变成b 1 j 的操作方式 属性 min 考虑过程比较难 从末尾开始考虑 三种操作方式上着手 以下来自AcWing网友整理 很细致 有三种操作