动态规划——最长公共子序列

文章目录

    • 概要
    • 整体流程
    • 问题描述
    • 递推公式由来
        • 两个序列的最后一位相等
        • 两个序列的最后一位不等
          • 左图
          • 右图
    • 表格填写
      • dp 表格定义
      • 递推公式
      • 填表过程
      • 填表过程解析
      • 最终结果
    • 小结

概要

动态规划相关知识

求解最长的公共子序列

整体流程

问题定义与区分:理解最长公共子串与最长公共子序列的区别。
动态规划思想:利用二维数组 dp 保存子问题结果,逐步推导递推公式。
递推公式推导:通过分析不同情况下的子序列关系,得出 dp 的状态转移方程。
结果总结:从表格中找到最长公共子序列的长度及具体子序列。

问题描述

理清背景
在这里插入图片描述
可能看上面的图片会晦涩难懂些,接下来用实例解释

我们可以给出两个序列S1和S2
在这里插入图片描述
若是求解公共子串,那么最大的公共子串就是ABC
而求解最大公共子序列,便是EABCE

到这里也可以看出它们之间的区别了,公共子串要求连续,而公共子串可以不连续

当序列长度较短时,我们可以通过肉眼观察得出结果。
但面对大规模数据时,仅靠人力显然不现实。因此,我们引入 动态规划 来解决这一问题。

动态规划需要的一般是:1.表格 2. 递推公式

现在需要先得到递推公式

递推公式由来

先定义二位数组dp进行保存,dp[i][j]的含义如下图,其值为最大公共子序列的长度
在这里插入图片描述
那么这个dp[i][j]咋球呢?分为以下三种情况
在这里插入图片描述

两个序列的最后一位相等

如图,最后一位都为A,那么A前的子序列的最大公共子序列则为dp[i-1][j-1]
这样放眼到完整子序列中,长度便是dp[i-1][j-1]+1
在这里插入图片描述
这样便可以得到递推公式

dp[i][j] = dp[i-1][j-1] + 1
两个序列的最后一位不等

在这里插入图片描述

左图
dp[i][j-1] 
右图
dp[i-1][j] 

假设dp[i][j-1] 的值为5,dp[i-1][j] 的值为6,求解公共子序列是不用考虑连续的,那么取两者中的最大值即可

dp[i][j] = MAX(dp[i-1][j] ,dp[i][j-1] )

得到总的递推公式
在这里插入图片描述

表格填写

有了递推公式后,我们便可以开始着手填写表格
在这里插入图片描述

dp 表格定义

我们使用动态规划 ( dp[i][j] ) 表示:
字符串 ( S_1 ) 的前 ( i ) 个字符字符串 ( S_2 ) 的前 ( j ) 个字符 的最长公共子序列长度。


递推公式

  1. 当 ( S_1[i] = S_2[j] ):
    两个字符相等时,最长公共子序列长度为:
    [
    dp[i][j] = dp[i-1][j-1] + 1
    ]

  2. 当 ( S_1[i] \neq S_2[j] ):
    两个字符不相等时,最长公共子序列长度取左边和上边的最大值:
    [
    dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    ]

  3. 初始化:

    • ( dp[0][j] = 0 ):与空字符串匹配的最长公共子序列长度为 0。
    • ( dp[i][0] = 0 ):与空字符串匹配的最长公共子序列长度为 0。

填表过程

0bdcaba
00000000
a0000111
b0111122
c0112222
b0112233
d0122233
a0122334

填表过程解析

  1. 初始化:

    • 第 0 行和第 0 列初始化为 0。
  2. 填充规则:

    • 若 ( S_1[i] = S_2[j] ):
      ( dp[i][j] = dp[i-1][j-1] + 1 )
    • 若 ( S_1[i] != S_2[j] ):
      ( dp[i][j] = max(dp[i-1][j], dp[i][j-1]) )
  3. 示例填充:

    • 第 1 行:当 ( S_1[1] = a ),( S_2[4] = a ),则 ( dp[1][4] = 1 )。
    • 第 2 行:当 ( S_1[2] = b ),( S_2[1] = b ),则 ( dp[2][1] = 1 )。
    • 第 6 行:当 ( S_1[6] = a ),( S_2[6] = a ),则 ( dp[6][6] = 4 )。

最终结果

  • 最长公共子序列长度:( dp[6][6] = 4 )。
  • 最长公共子序列:通过回溯得到 “bdca”


图示回顾:

LCS过程


通过动态规划高效解决 最长公共子序列 问题,适用于序列匹配、文本编辑等实际场景。

小结

以上笔记图来源于b站视频:包教包会~最长公共子序列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node的学习以及学习通过Node书写接口并简单操作数据库

Node的学习 Node的基础上述是关于Node的一些基础,总结的还行; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹,并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…

arXiv-2024 | NavAgent:基于多尺度城市街道视图融合的无人机视觉语言导航

作者:Youzhi Liu, Fanglong Yao*, Yuanchang Yue, Guangluan Xu, Xian Sun, Kun Fu 单位:中国科学院大学电子电气与通信工程学院,中国科学院空天信息创新研究院网络信息系统技术重点实验室 原文链接:NavAgent: Multi-scale Urba…

易语言鼠标轨迹算法(游戏防检测算法)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

Three.js材质纹理扩散过渡

Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

赫布定律 | 机器学习 / 反向传播 / 经验 / 习惯

注:本文为 “赫布定律” 相关文章合辑。 未整理。 赫布定律 Hebb‘s law 馥墨轩 2021 年 03 月 13 日 00:03 1 赫布集合的基本定义 唐纳德・赫布(Donald Hebb)在 1949 年出版了《行为的组织》(The Organization of Behavior&a…

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长,主要是想要表述的功能点有点多; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分,可以单击预览大图,同时在预览界面可以双指放大缩小图片并且可以移动查看图片,双击放大&#xff0…

杭州乘云联合信通院发布《云计算智能化可观测性能力成熟度模型》

原文地址:杭州乘云联合中国信通院等单位正式发布《云计算智能化可观测性能力成熟度模型》标准 2024年12月3日,由全球数字经济大会组委会主办、中国信通院承办的 2024全球数字经济大会 云AI计算创新发展大会(2024 Cloud AI Compute Ignite&…

第6章图6.21-6.27-《分析模式》原图和UML图对比

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集

如何在谷歌浏览器中设置广告屏蔽

在数字时代,网络广告无处不在,虽然它们为网站提供了收入来源,但有时也会干扰我们的浏览体验。如果你正在寻找一种方法来减少这些干扰,那么在谷歌浏览器中设置广告屏蔽是一个不错的选择。本文将指导你完成这一过程,并简…

认识网络互联设备(二)

交换机 功能: (1)通过支持并行通信,提高交换机的信息吞吐量; (2)将传统的一个大局域网上的用户分若干工作组,每个端口连接一台设备或者连接一个工作组,有效的解决了拥塞情…

数据可视化-2. 条形图

目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果(网页显示&#…

AMBA-CHI协议详解(十二)

AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transac…

【MATLAB第109期】基于MATLAB的带置信区间的RSA区域敏感性分析方法,无目标函数

【MATLAB第108期】基于MATLAB的带置信区间的RSA区域敏感性分析方法,无目标函数 参考第64期文章【MATLAB第64期】【保姆级教程】基于MATLAB的SOBOL全局敏感性分析模型运用(含无目标函数,考虑代理模型) 创新点: 1、采…

《外国服务区加油站模型:功能与美观的完美结合 caotu66.com》

这个外国服务区加油站模型在设计上独具特色,兼具实用性和美观性。 从整体布局来看,加油站位于服务区的显眼位置。加油站的顶棚采用了现代风格的设计,顶棚的颜色主要是黄色和蓝色,色彩鲜明且具有辨识度。顶棚下方有多个加油柱&…

mybatis-plus超详细讲解

mybatis-plus (简化代码神器) 地址:https://mp.baomidou.com/ 目录 mybatis-plus 简介 特性 支持数据库 参与贡献 快速指南 1、创建数据库 mybatis_plus 2、导入相关的依赖 3、创建对应的文件夹 4、编写配置文件 5、编写代码 …

数据结构(顺序表)JAVA方法的介绍

前言 在 Java 中,集合类(Collections)是构建高效程序的核心组件之一,而 List 接口作为集合框架中的重要一员,是一个有序、可重复的元素集合。与 Set 接口不同,List 保证了元素的顺序性,并允许存…

泊松编辑 possion editing图像合成笔记

开源地址: GitHub - kono-dada/Reproduction-of-possion-image-editing 掩码必须是矩形框

【Flink-scala】DataStream编程模型之状态编程

DataStream编程模型之状态编程 参考: 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scal…

Linux实操篇-远程登录/Vim/开机重启

目录 传送门前言一、远程登录1、概念2、ifconfig3、实战3.1、SSH(Secure Shell)3.2、VNC(Virtual Network Computing)3.3、RDP(Remote Desktop Protocol)3.4、Telnet(不推荐)3.5、FT…