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. 最短编辑距离(动态规划) 的相关文章

  • 01背包问题(采药) 动态规划,python实现

    采药问题 题目描述 辰辰是个天资聪颖的孩子 他的梦想是成为世界上最伟大的医师 为此 他想拜附近最有威望的医师为师 医师为了判断他的资质 给他出了一个难题 医师把他带到一个到处都是草药的山洞里对他说 孩子 这个山洞里有一些不同的草药 采每一株
  • 12、剪绳子——剑指offer——动态规划

    剪绳子 问题描述 给你一根长度为n的绳子 请把绳子剪成m段 m和n都是整数 n gt 1并且m gt 1 每段绳子的长度记为k 0 k 1 k m 请问k 0 k 1 k m 可能的最大乘积是多少 首先本题可以用贪婪算法和动态规划算法求解
  • Acwing 291. 蒙德里安的梦想

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

    动态规划 Dynamic Programming 是一种具有分治思想的迭代技术 它用于求解某些复杂的不包含决策过程的最优化问题 其基本思路是将原问题分解为子问题 并保存子问题的求解结果 从而避免不必要的重复计算 动态规划的主要思想就是将复杂
  • 基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 目录 1 概述 2 运行结果 2 1 Dijkstra算法 2 2 A 算法 2 3 动态规划 3 Matlab代码实现 1 概述 在基
  • 1746. 经过一次操作后的最大子数组和

    1746 经过一次操作后的最大子数组和 你有一个整数数组 nums 你只能将一个元素 nums i 替换为 nums i nums i 返回替换后的最大子数组和 示例 1 输入 nums 2 1 4 3 输出 17 解释 你可以把 4替换为
  • LeetCode:动态规划中的子序列问题

    PS 本文是参考代码随想录做的一些笔记 完整版本请戳链接 非常好的教程 本文列举了一些经典题目 特别是编辑距离 基本上的题目解题思路都是一样的 可以说是一个路子 300 最长递增子序列 给你一个整数数组 nums 找到其中最长严格递增子序列
  • 最长公共上升子序列(LCIS)

    前置知识 LCS LIS 注意 刚开始看这个问题的时候 第一反应是先求出LCS再求出LCS的LIS 事实上这是有问题的 我们并不能保证这么求出的LCIS是最长的 比如下面这个例子 Example a 7 1 5 6 4 2 7 b 7 1
  • 删除与获得点数--动态规划

    Leetcode 740 删除与获得点数 题目描述 给定一个整数数组 nums 你可以对它进行一些操作 每次操作中 选择任意一个 nums i 删除它并获得 nums i 的点数 之后 你必须删除每个等于 nums i 1 或 nums i
  • 每日一题:路径计数

    路径计数 题目 Daimayuan Online Judge f i j 表示从左上角走到 i j 的方案数 状态转移 i j 由 i 1 j 和 i j 1 转移而来 初始状态 得使得f 1 1 为1 所以初始化f 1 0 或者f 0 1
  • 数学建模常用的四大模型

    目录 1 评价模型 2 优化模型 3 分类模型 4 预测模型 本文主要介绍数学建模的四大模型分类 分别是评价模型 优化模型 分类模型 预测模型 关注公众号 数模乐园 回复 买 获得更多数模教程 1 评价模型 评价模型可以处理难于完全定量分析
  • 数字三角形之动态规划(C语言实现)

    算法步骤 1 首先构造三个数组 第一个是存储三角形初始值的数组data 第二个是存储顶点到该点最大值的res 数组 第三个是存储该点上一个点的loc 数组 这里要对res 数组进行初始化 1 2 按照三角形的层次结构 从上到下 从左到右依次
  • 最近在学动态规划,很有意思的算法(1)拿金币

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • 【动态规划】从入门到实践---动态规划详解

    目录 1 动态规划概念 一 定义数组元素的含义 二 找到数组元素之间的关系表达式 三 找到初始值 2 案例详解 一 爬楼梯 1 定义数组元素的含义 2 找到数组元素之间的关系表达式 3 找到初始值 案例二 最短路径 题目 做题步骤 1 定义
  • 《算法图解》第九章动态规划学习心得

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

    目录 题目 示例 分析 代码 题目 示例 分析 题目顾名思义 让我们求出第N个泰波那契数 也就是除了开头三个数之外 第四个数开始就是等于前三个数之和 不要和斐波那契数弄混了 斐波那契是前两个数的和 泰波那契是前三个数的和 也就是说当前数 我
  • 3254 Corn Fields 这题解真的不能再详细了!

    题意 农场主John新买了一块长方形的新牧场 这块牧场被划分成 M M M行 N N N列 1
  • C++---区间DP---加分二叉树(每日一道算法2023.4.28)

    题目 设一个 n 个节点的二叉树 tree 的中序遍历为 1 2 3 n 其中数字 1 2 3 n 为节点编号 每个节点都有一个分数 均为正整数 记第 i 个节点的分数为 di tree 及它的每个子树都有一个加分 任一棵子树 subtre
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 超简单:很火的3D立体动态相册,送给心爱的那个人

    1 首先 我们一共需要三个文件 目录关系如下所示 先建index html文件吧 电脑上先创建一个 txt文件 在里面加入代码后保存 重命名为index html 记得把原来的 txt后缀覆盖 html我用的谷歌浏览器 index html

随机推荐

  • 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网友整理 很细致 有三种操作