动态规划——两个数组的dp问题
目录
一、最长公共子序列
二、不同的子序列
三、通配符匹配
四、正则表达式匹配
五、两个字符串的最小ASCII删除和
六、最长重复子数组
七、交错字符串
一、最长公共子序列
最长公共子序列

第一步:确定状态表示
dp[i][j]:表示字符串 s1 的 [0,i] 区间以及字符串 s2 的[0,j] 区间内所有子序列中,最长公共子序列的长度。
第二步:推出状态转移方程

第三步:初始化dp表
关于字符串的 dp 问题,我们需要考虑空串的情况,比如 s1 选一个空串,s2 选一个空串,其实也属于是一个公共子序列,不过公共子序列长度为0。
我们可以在原始 dp 表上多加一行一列,第0行表示第一个字符串为空,第0列表示第二个字符串为空。

让dp表多加了一行和一列后,我们需要注意dp表的下标和字符串下标的对应关系。
解题代码:
class Solution
{
public:int longestCommonSubsequence(string s1, string s2) {int m = s1.size(), n = s2.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(s1[i-1] == s2[j-1])dp[i][j] = dp[i-1][j-1] + 1;elsedp[i][j] = max(dp[i-1][j], max(dp[i][j-1], dp[i-1][j-1]));}}return dp[m][n];}
};

二、不同的子序列
不同的子序列

第一步:确定状态表示
dp[i][j]:表示s字符串 [0,i]区间内所有子序列中,有多少个t字符串 [0,j] 区间内的子串。
第二步:推出状态转移方程

第三步:初始化dp表。
我们需要考虑空串的情况,比如 s1 选一个空串,s2 选一个空串,其实也属于是一个公共子序列。
第一行表示 s 字符串为空串,s 如果是空串,t 只有是空串,才能在 s 中找到 t。第一列表示 t 字符串为空串,t 如果是空串,s 不管是什么字符串,它里面都有一个空串。因此第一列应该全都是1。

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

三、通配符匹配
通配符匹配

第一步: 确定状态表示
dp[i][j]:表示p[0,i] 区间内的子串能否匹配 s[0,j] 区间内的子串。
第二步:推出状态转移方程

第三步:初始化dp表
如果s是空字符串,p字符串前面出现 ’ * ‘ 可以匹配空串,但是 ’ * ‘ 之后如果出现其他字符了,后面不管有多少个’ * '都不能匹配了。

dp[i][j]表示p[0,i] 区间内的子串能否匹配 s[0,j] 区间内的子串。题目要求是整个字符串,因此返回dp[m][n],m是s的长度,n是p的长度。
解题代码:
class Solution
{
public:bool isMatch(string s, string p) {int m = p.size(), n = s.size();vector<vector<bool>> dp(m+1, vector<bool>(n+1, false));dp[0][0] = true;for(int i = 1; i <= m; i++){if(p[i-1] == '*')dp[i][0] = true;elsebreak;}for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(p[i-1] == '?')dp[i][j] = dp[i-1][j-1];else if(p[i-1] == '*')dp[i][j] = dp[i][j-1] || dp[i-1][j];else{if(p[i-1] == s[j-1] && dp[i-1][j-1])dp[i][j] = true;}}}return dp[m][n];}
};

四、正则表达式匹配
正则表达式匹配

第一步:确定状态表示
dp[i][j]:表示 p[0,i] 区间内的子串能否匹配 s[0,j] 区间内的字符串。
第二步:推出状态转移方程

第三步:初始化dp表
dp表上面多加一行表示p是空串,左边多加一列表示s是空串。接下来看看里面值应该填什么。
对于第一行,如果p是空串,s也是空串,肯定能匹配,所以第一行第一个空格还是true。
后续如果 p 是空串,s不是空串,肯定匹配不上,所以第一行后续都是false。

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

五、两个字符串的最小ASCII删除和
两个字符串的最小ASCII删除和

预处理:本道题是让我们找使两个字符串相等,所需删除字符的ASCII值最小。而最开始的两个字符串的ASCII值总和是不变的,那么我们只需要找到两个字符串相同后,其ASCII值最大,那么删除的字符的ASCII值一定就是最小的。
所以说,该问题就转化成了:求两个字符串的所有公共子序列里面,ASCII值的最大和。
第一步:确定状态表示
dp[i][j]:表示字符串 s1 的 [0,i] 区间以及字符串 s2 的 [0,j] 区间内的所有公共子序列中, ASCII值最大和。
第二步:推出状态转移方程
对于s1[0,i]区间和s2[0,j]区间的公共子序列有四种情况,即:
有s1[i],有s2[j]
有s1[i],没有s2[j]
没有s1[i],有s2[j]
没有s1[i],没有s2[j]
情况四可以包含在情况二中。

第三步:初始化dp表

第四步:确定返回值
状态表示求的是两个字符串的区间里面公共子序列的ASCII值最大和。
而题目要求使两个字符串相等所需删除字符的ASCII值的最小和 。所以可以这样做:
1、找到两个字符串中公共子序列的Ascll 最大和,dp[m][n]。
2、统计两个字符串中ASCII值总和,sum。
3、sum - dp[m][n] * 2。
解题代码:
class Solution
{
public:int minimumDeleteSum(string s1, string s2) {int m = s1.size(), n = s2.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(s1[i-1] == s2[j-1])dp[i][j] = dp[i-1][j-1] + s1[i-1];dp[i][j] = max(dp[i][j], max(dp[i][j-1], dp[i-1][j]));}}int sum = 0;for(auto x : s1)sum += x;for(auto x : s2)sum += x;return sum - 2 * dp[m][n];}
};

六、最长重复子数组
最长重复子数组

第一步:确定状态表示
dp[i][j]:表示数组 nums1 中以 i 位置元素为结尾的所有的子数组以及数组 nums2 中以 j 位置元素为结尾的所有子数组中,最长公共子数组的长度。
第二步:推出状态转移方程

第三步:初始化dp表

填写顺序:根据状态转移方程。从上往下填写每一行。 最后的返回值是 dp 表里面的最大值。
解题代码:
class Solution
{
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size(), n = nums2.size();vector<vector<int>> dp(m+1, vector<int>(n+1));int ret = 0;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;ret = max(ret, dp[i][j]);}}return ret;}
};

七、交错字符串
交错字符串

预处理:为了下标对应,我们给每个字符串的前面都加上一个空格字符。
第一步:确定状态表示
dp[i][j]:表示s1[1,i]区间内的字符串和s2[1,j]区间内的字符串能不能拼成s3[1,i+j]区间内的字符串。
第二步:推出状态转移方程

第三步:初始化dp表

解题代码:
class Solution
{
public:bool isInterleave(string s1, string s2, string s3) {int m = s1.size(), n = s2.size();if(m+n != s3.size())return false;s1 = " " + s1;s2 = " " + s2;s3 = " " + s3;vector<vector<bool>> dp(m+1, vector<bool>(n+1));dp[0][0] = true;for(int i = 1; i <= n; i++){if(s2[i] == s3[i])dp[0][i] = true;elsebreak;}for(int i = 1; i <= m; i++){if(s1[i] == s3[i])dp[i][0] = true;elsebreak;}for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(s1[i] == s3[i+j] && dp[i-1][j])dp[i][j] = true;else if(s2[j] == s3[i+j] && dp[i][j-1])dp[i][j] = true;}}return dp[m][n];}
};

相关文章:
动态规划——两个数组的dp问题
目录 一、最长公共子序列 二、不同的子序列 三、通配符匹配 四、正则表达式匹配 五、两个字符串的最小ASCII删除和 六、最长重复子数组 七、交错字符串 一、最长公共子序列 最长公共子序列 第一步:确定状态表示 dp[i][j]:表示字符串 s1 的 [0&am…...
视频QoE测量学习笔记(二)
目录 自适应比特率(ABH或ABS) HAS:HTTP adaptive streaming 自适应本质: HAS正在解决传统流协议中主要关注的几个方面: DASH标准化原因 HAS发展 编码: 影响HAS系统的四个主要问题: 一个健全的HAS方…...
RSA算法详解:原理与应用
RSA算法详解:原理与应用 RSA算法是现代密码学的基石之一,广泛应用于安全通信、数据加密和身份验证等领域。本文将详细介绍RSA算法的原理、实现步骤以及实际应用。 一、RSA算法概述 RSA(Rivest-Shamir-Adleman)算法由Ron Rivest…...
YOLOv6-4.0部分代码阅读笔记-effidehead_fuseab.py
effidehead_fuseab.py yolov6\models\heads\effidehead_fuseab.py 目录 effidehead_fuseab.py 1.所需的库和模块 2.class Detect(nn.Module): 3.def build_effidehead_layer(channels_list, num_anchors, num_classes, reg_max16, num_layers3): 1.所需的库和模块 impo…...
特朗普概念股DJT股票分析:为美国大选“黑天鹅事件”做好准备
猛兽财经核心观点: (1)特朗普媒体科技集团的股价近期已经从年初至今的高点下跌了35%以上。 (2)该公司将面临一个重大的黑天鹅事件。 (3)这一结果将对特朗普媒体科技集团产生重大影响。 随着投资…...
【MySQL】 运维篇—故障排除与性能调优:常见故障的排查与解决
数据库系统在运行过程中可能会遇到各种故障,如性能下降、连接失败、数据损坏等。及时有效地排查和解决这些故障,对于保证系统的稳定性和数据的完整性至关重要。 常见故障及排查方法 1. 数据库连接失败 故障描述:应用程序无法连接到数据库&…...
Android R S T U版本如何在下拉栏菜单增加基本截图功能
本文主要是MTK增加下拉栏开关菜单,功能实现为基本的截图功能,metrics_constants.proto修改 QuickSetting 新增快捷设置图标,以便对应getMetricsCategory获取;一个布局文件,一个配置加载合入实现,一个新增想要实现截图的类。 /frameworks/base/proto/src/metrics_constan…...
C#二叉树原理及二叉搜索树代码实现
一、概念 二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的每个节点包含三个部分:一个值、一个指向左子节点的引用和一个指向右子节点的引用。 二、二叉树…...
.eslintrc.js 的解释
如果您的项目中没有 .eslintrc.js 文件,您可以按以下步骤创建并配置 ESLint: 1. 创建 ESLint 配置文件 在您的项目根目录下创建一个新的文件,命名为 .eslintrc.js。 2. 配置 ESLint 规则 在 .eslintrc.js 文件中添加以下内容,…...
确保企业架构与业务的一致性与合规性:数字化转型中的关键要素与战略实施
在现代企业的数字化转型过程中,确保企业架构(Enterprise Architecture, EA)与企业业务的紧密一致性与合规性至关重要。无论是在战略层面还是运营层面,EA都为企业的未来发展提供了清晰的蓝图,确保企业在应对复杂的业务环…...
goframe开发一个企业网站 前端界面 拆分界面7
将页面拆出几个公用部分 在resource/template/front创建meta.html header.html footer.html meta.html <head><meta charset"utf-8"><meta content"widthdevice-width, initial-scale1.0" name"viewport"><title>{{.…...
Postman断言与依赖接口测试详解!
在接口测试中,断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性,还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具,不仅支持发送HTTP请求和接收响应,还提供了丰富的断言功能,帮助测试…...
github打不开网络问题
当打开github出现超时或者网络不能访问的情况时,我们进行如下方法解决: 1,ping gitbub.com查看域名分析的DNS IP C:\Users\86156>ping github.com 正在 Ping github.com [20.205.243.166] 具有 32 字节的数据: 来自 20.205.243.166 的回复…...
智能教育工具:基于SpringBoot的在线试题库
1 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的…...
typescript 如何跳过ts类型检查?
文章目录 前言any类型条件判断进行使用断言加注释跳过ts检查 前言 typescript 的使用,虽然让代码更加规范,利于维护,但也给开发带来很多麻烦。为了跳过很多ts的类型检查,大家也是费尽心思,下面就介绍一些常用的方式&a…...
详解ReentrantLock--三种加锁方式
目录 介绍AQS: 直观方式解释加锁的流程: Node是什么:它里面有什么属性呢 图解队列的排队过程: 源码分析三种加锁流程: 我们先讲解一下非公平锁的加锁流程: Lock()方式加锁: 在源码里对于Lock()的解…...
SQL 基础语法(一)
文章目录 1. SQL 分类2. 数据库操作3. 数据表操作4. 增删改操作5. 查询操作6. 用户管理7. 权限控制 1. SQL 分类 2. 数据库操作 #创建数据库 create database if not exists test;#查询所有数据库 show databases;#查询当前数据库 select database();#删除数据库 drop databas…...
Python酷库之旅-第三方库Pandas(190)
目录 一、用法精讲 881、pandas.Index.is_方法 881-1、语法 881-2、参数 881-3、功能 881-4、返回值 881-5、说明 881-6、用法 881-6-1、数据准备 881-6-2、代码示例 881-6-3、结果输出 882、pandas.Index.min方法 882-1、语法 882-2、参数 882-3、功能 882-4、…...
Spring学习笔记_19——@PostConstruct @PreDestroy
PostConstruct && PreDestroy 1. 介绍 PostConstruct注解与PreDestroy注解都是JSR250规范中提供的注解。 PostConstruct注解标注的方法可以在创建Bean后在为属性赋值后,初始化Bean之前执行。 PreDestroy注解标注的方法可以在Bean销毁之前执行。 2. 依赖…...
《云计算网络技术与应用》实训8-1:OpenvSwitch简单配置练习
1.按《云计算网络技术与应用》实训5-1进行环境配置,安装好OVS 2.开启OVS虚拟交换机 3.创建一个网桥br0 4.查看网桥列表 5.把ens34网卡连接到网桥br0上 6. 查看网桥br0所有端口 7.列出网卡ens34连接的所有网桥列表 8.查看OVS网络状态 9.将网桥br0上连接的网卡ens34删…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
