当前位置: 首页 > news >正文

动态规划之两个数组的 dp(上)

文章目录

  • 最长公共子序列
  • 不相交的线
  • 不同的子序列
  • 通配符匹配

最长公共子序列

题目:最长公共子序列

在这里插入图片描述
思路

选取s1[0, i]区间以及s2[0, j]区间作为研究对象

  • 状态表示:dp[i][j]表示,s1[0, i]区间以及s2[0, j]区间内所有的子序列中,最长公共子序列的长度

  • 状态转移方程:

    • s1[i] == s2[j]时,即最长公共子序列以s1[i]结尾,所以有dp[i][j] = dp[i - 1][j - 1] + 1
    • s1[i] != s2[j]时,最长公共子序列一定不以s1[i]结尾,所以
      1. s1[0, i - 1]区间以及s2[0, j]区间寻找答案,即dp[i][j] = dp[i - 1][j]
      2. s1[0, i]区间以及s2[0,j - 1 ]区间寻找答案,即dp[i][j] = dp[i][j - 1]
      3. s1[0, i - 1]区间以及s2[0, j - 1]区间寻找答案,即dp[i][j] = dp[i - 1][j - 1]
      • 综上,12以及包括3,所以dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
  • 初始化:引入空串,帮助我们初始化
    s1, s2前添加一个空字符,也就是说s1[0]s2[0]的位置的值是空串;
    dp表的大小为 (m+1) x (n+1),其中 m n s1s2的长度。初始化时,将第一行和第一列的值都设置为0
    注意下标的映射

  • 填表顺序:每次ij都需要用到i - 1j - 1,所以从上往下填,从左往右填

  • 返回值:dp[m][n],其中 m n s1s2的长度

C++代码

class Solution 
{
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.size(), n = text2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)if(text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);return dp[m][n];}   
};

不相交的线

题目:不相交的线

在这里插入图片描述
思路

阅读本题后发现和上题解法基本相同

C++代码

class Solution 
{
public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size(), n = nums2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (nums1[i - 1] == nums2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);return dp[m][n];}
};

不同的子序列

题目:不同的子序列

在这里插入图片描述
思路

选取t[0, i]区间以及s[0, j]区间作为研究对象

  • 状态表示:dp[i][j]表示,s[0, j]区间内所有的子序列中,有多少个t[0, i]区间内的子串
  • 状态转移方程:根据s的子序列包不包含s[j]来划分
    • 包含s[j]时,t[i] == s[j],此时dp[i][j] = dp[i - 1][j - 1]
    • 不包含s[j]时,此时dp[i][j] = dp[i][j - 1]
  • 初始化:引入空串,注意下标的映射,
    • t为空时,s中至少有一个空串是其子串,所以第一行为1
    • s为空时,t只有是空串时,符合题意,第一列除了第一个都是0
  • 填表顺序:ij填写都需要用到i - 1j - 1,所以从上往下填,从左往右填
  • 返回值:dp[m][n],其中 m n ts的长度

C++代码

class Solution 
{
public:int numDistinct(string s, string t) {int m = t.size(), n = s.size();vector<vector<double>> dp(m + 1, vector<double>(n + 1));for(int j = 0; j <= n; j++) dp[0][j] = 1;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){dp[i][j] += dp[i][j - 1];if(t[i - 1] == s[j - 1]) dp[i][j] += dp[i - 1][j - 1];}return dp[m][n];}
};  

通配符匹配

题目:通配符匹配

在这里插入图片描述
思路

选取选取第一个字符串[0, i]区间以及第二个字符串 [0, j]区间作为研究对象

  • 状态表示:dp[i][j]表示,p[0, j]区间内的子串中,能否匹配s[0, i]区间内的子串

  • 状态转移方程:根据根据最后一个位置的元素,来讨论

    • p[j]是普通字符,s[i] == p[j] && dp[i - 1][j - 1] == true ->true
    • p[j] == '?'dp[i - 1][j - 1] == true -> true
    • p[j] == '*'
      • 匹配空串,dp[i][j - 1]
      • 匹配一个字符s[i]dp[i - 1][j - 1]
      • 匹配两个字符s[i]、s[i - 1]dp[i - 2][j - 1]
      • ... ... ... ...

      优化p[j] == '*'

        1. 我们注意到
      • dp[i][j] = dp[i][j -2] || dp[i - 1][j - 2] || dp[i -2][j -2] || ... ...
      • dp[i - 1][j] = dp[i - 1][j -2] || dp[i - 2][j - 2] || dp[i -3][j -2] || ... ...
      • 所以,dp[i][j] = dp[i][j - 1] || dp[i - 1][j]
      • 匹配空串,dp[i][j - 1]
      • 匹配一个,但不舍去*dp[i - 1][j]
      • 所以,dp[i][j] = dp[i][j - 1] || dp[i - 1][j]
  • 初始化:引入空串,注意下标的映射,

    • 初始化整个数组为false
    • dp[0][0]表示两个空串是否匹配,初始化为true
    • 第一行表示s 为空串,p 串与空串只有一种匹配可能,即 p 串表示为 "***",此时也相当于空串匹配上空串,将所有前导为 "*" p子串与空串的 dp 值设为true
  • 填表顺序:ij填写都需要用到i - 1j - 1,所以从上往下填,从左往右填

  • 返回值:dp[m][n],其中 m n sp的长度

C++代码

class Solution 
{
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));s = " " + s;p = " " + p;dp[0][0] = true;for(int j = 1; j <= n; j++)if(p[j] == '*') dp[0][j] = true;else break;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(p[j] == '*')dp[i][j] = dp[i - 1][j] || dp[i][j - 1];elsedp[i][j] = (p[j] == '?' || s[i] == p[j]) && dp[i -1][j - 1];}return dp[m][n];}
};

相关文章:

动态规划之两个数组的 dp(上)

文章目录 最长公共子序列不相交的线不同的子序列通配符匹配 最长公共子序列 题目&#xff1a;最长公共子序列 思路 选取s1的[0, i]区间以及s2的[0&#xff0c; j]区间作为研究对象 状态表示&#xff1a;dp[i][j]表示&#xff0c;s1的[0, i]区间以及s2的[0&#xff0c; j]区间内…...

DC-9靶机通关

这是这个系列的最后一个靶机了&#xff01;&#xff01;&#xff01;经过前面的锻炼和学习&#xff0c;这次我的目标是尽量不借助任何教程或者提示来拿下这个靶机&#xff01;&#xff01;&#xff01;下面我们看能不能成功&#xff01;&#xff01;&#xff01; 1.实验环境 攻…...

前端注释都应该怎么写?

以下是一些前端注释的例子&#xff0c;展示了如何应用前面提到的建议&#xff1a; 1. 使用清晰、简洁的语言 // 计算两个数的平均值 function calculateAverage(a, b) {return (a b) / 2; }2. 描述代码的目的和功能 // 将日期格式化为 "YYYY-MM-DD" 的字符串 fun…...

深入解析缓存模式下的数据一致性问题

今天&#xff0c;我们来聊聊常见的缓存模式和数据一致性问题。 常见的缓存模式有&#xff1a;Cache Aside、Read Through、Write Through、Write Back、Refresh Ahead、Singleflight。 缓存模式 Cache Aside 在 Cache Aside 模式中&#xff0c;是把缓存当做一个独立的数据源…...

嵌入式常用功能之通讯协议1--IIC

嵌入式常用功能之通讯协议1--串口 嵌入式常用功能之通讯协议1--IIC&#xff08;本文&#xff09; 嵌入式常用功能之通讯协议1--SPI 一、IIC总线协议介绍 Inter-Integrated Circuit(集成电路总线&#xff09;&#xff0c;是由 Philips 半导体公司&#xff08;现在的 NXP 半导体…...

【Wi-Fi】Wi-Fi 7(802.11be) Vs Wi-Fi 8 (802.11bn)

介绍 WiFi 7 &#xff08;802.11be&#xff09; 是 WiFi-6 &#xff08;802.11ax&#xff09; 的继任者&#xff0c;旨在提高数据速率并减少拥挤环境中的延迟。 WiFi 8 &#xff08;8021.1bn&#xff09;是后续标准&#xff0c;专注于提高 WLAN 连接的可靠性&#xff0c; 提高…...

Ubuntu软件包管理机制

文章目录 &#x1f34a;自我介绍&#x1f34a;Ubuntu软件包管理机制&#x1f34a;软件安装命令详解&#xff1a; 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好…...

SpringBoot详解:概念、优点、运行方式、配置文件、异步请求及异常处理

一、什么是SpringBoot&#xff1f; SpringBoot是一个基于Spring框架的开源项目&#xff0c;它简化了Spring应用的初始搭建以及开发过程。它提供了自动配置、起步依赖、Actuator、命令行界面等特性&#xff0c;使得开发者可以快速构建出一个独立、生产级别的Spring应用。 二、…...

npm install -g @vue/cil 非常卡慢

安装 vue/cli 时遇到卡慢的情况通常和网络问题有关&#xff0c;特别是国内的网络环境下访问 npm 的服务器可能较慢。你可以尝试以下几种方法来加速&#xff1a; 使用淘宝镜像源 淘宝 NPM 镜像源对国内用户更加友好。你可以临时使用淘宝镜像源安装 vue/cli&#xff1a; npm inst…...

Windows 基础 (二):系统目录与环境变量

内容预览 ≧∀≦ゞ Windows 基础 2&#xff1a;系统目录与环境变量声明系统目录系统核心目录其他重要日志目录应用程序数据目录用户数据目录隐藏目录 环境变量1. 查看环境变量2. 设置永久环境变量3. 查看特定环境变量的值4. 环境变量的存储位置5. 自定义环境变量的应用 结语 Wi…...

World of Warcraft [CLASSIC][80][the Ulduar] BOSS 05 06 07

BOSS-05-钢铁议会 BOSS-06-科隆加恩&#xff08;无困难模式&#xff09; BOSS-07-欧尔莉亚&#xff08;无困难模式&#xff09;...

World of Warcraft [CLASSIC][80][the Ulduar] BOSS 12 13

BOSS-12-维扎克斯将军 BOSS-13-尤格萨隆...

第一篇 硬件篇1[学习-来自 正点原子]

在电路设计中&#xff0c;TVS&#xff08;瞬态电压抑制器&#xff09;是一种有效的保护元件&#xff0c;可以用来防止瞬时过电压对芯片和其他敏感器件造成损坏。 STM32F103RCT6作为MCU 一键下载电路的具体实现过程&#xff1a; 首先&#xff0c; mcuisp控制 DTR输出低电平&…...

【TextIn:开源免费的AI智能文字识别产品(通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等)】

TextIn&#xff1a;开源免费的AI智能文字识别产品&#xff08;通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等&#xff09; 产品的官网&#xff1a;TextIn官网 希望感兴趣以及有需求的小伙伴们多多了解&#xff0c;因为这篇文章也是源于管网介绍才产出的…...

C++语言有哪些常用语句?

1. 变量定义语句 在 C 中&#xff0c;首先要定义变量才能使用。例如 int a;定义了一个整型变量a。这是很基础的语句&#xff0c;它告诉编译器为变量a分配内存空间&#xff0c;用于存储整数值。 如果要定义多个相同类型的变量&#xff0c;可以写成 int a, b, c;除了基本数据类…...

linux alsa-lib snd_pcm_open函数源码分析(二)

​ 访问原版内容&#xff0c;可直接到博客 linux alsa-lib snd_pcm_open函数源码分析&#xff08;二) https://blog.whatsroot.xyz/2020/08/12/alsa_snd_open-analysis-2/ 系列文章其他部分: linux alsa-lib snd_pcm_open函数源码分析&#xff08;一) linux alsa-lib snd_pc…...

机翼的抖振与颤振

机翼的抖振与颤振 1. 机翼颤振&#xff1a;飞机设计的隐形杀手2. 机翼抖振&#xff1a;由气流不稳定性引起的振动3. 两种振动的区分和管理3.1 检测与预防 机翼的颤振和抖振是飞机设计和航空工程师面临的两个重要技术问题。这两种现象虽然都与机翼的振动相关&#xff0c;但它们的…...

React04 State变量 组件渲染

State变量 & 渲染和提交 State 变量state 变量的使用State 是隔离且私有的 组件渲染 State 变量 state 变量的使用 导入 useState import { useState } from react;定义一个 state 变量 const [index, setIndex] useState(0);useState 的唯一参数是 state 变量的初始值…...

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据查询(超详细)

目录 一、单表查询 1. 简单的数据查询 &#xff08;1&#xff09;选择表中若干列 &#xff08;2&#xff09;选择表中若干行&#xff08;元祖&#xff09; 2. 聚合函数与分组查询 聚集函数 GROUP BY分组查询 二、联接查询 1、连接概述 2. 内联接&#xff08;INNER JO…...

mysql-恢复数据(日志管理)

前言 在mysql中我们有时候会出现误删除&#xff0c;或者其他的问题&#xff0c;我们可以通过mysql的日志进行恢复 操作 我们可以在mysql里面定义一个错误日志&#xff0c;方便我们可以排查是因为什么原因来解决mysql无法启动问题 ----------------------------------------…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...