动态规划<九>两个数组的dp

目录

引例

 LeetCode经典OJ题

1.第一题

2.第二题

 3.第三题

 4.第四题

 5.第五题

 6.第六题

 7.第七题

引例

OJ传送门LeetCode<1143>最长公共子序列

画图分析:

使用动态规划解决

1.状态表示 ------经验+题目要求

经验为选取第一个字符串的[0,i]区间以及第二个字符串的[0,j]区间作为研究对象,再根据实际的题目要求,确定状态表示

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

2.状态转移方程----根据最后一个位置的状况,分情况讨论

3.初始化

在关于字符串的dp问题中,空串也是有研究意义的

在这里引入空串是为了方便我们后面的初始化,根据状态转移方程会发生越界的为第一行和第一列,因此可以采用多加一行和一列的方式来完成初始化

 

注意下标的映射关系

4.填表顺序   从上往下,从左往右

5.返回值 dp[m][n](m,n分别为字符串的长度)

具体代码:

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;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);return dp[m][n];}

 LeetCode经典OJ题

1.第一题

OJ传送门LeetCode<1035>不相交的线

画图分析:

 动态规划各步与引例相同

具体代码:

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;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);return dp[m][n];}

2.第二题

OJ传送门LeetCode<115>不同的子序列

画图分析:

 使用动态规划解决

1.状态表示

dp[i][j]表示:字符串s的[0,j]区间内所有的子序列中,有多少个字符串t的[0,i]区间内的子串

2.状态转移方程

根据字符串s的子序列的最后一个位置包不包含s[j]

3.初始化

会发生越界的为第一行和第一列,可以采用多加一行和一列的方式来初始化

根据状态表示,i=0的这一行是去s中寻找空串,有一个,j=0的这一列是空串中寻找t的子串,是找不到的,初始化为0

4.填表顺序

从上往下,从左往右

5.返回值  dp[m][n]

具体代码:

int numDistinct(string s, string t) {const int MOD=1e9+7;int m=t.size(),n=s.size();vector<vector<int>> dp(m+1,vector<int>(n+1));for(int i=0;i<=n;++i) dp[0][i]=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];dp[i][j]%=MOD;}}return dp[m][n];}

 3.第三题

OJ传送门LeetCode<44>通配符匹配

画图分析:

使用动态规划解决

1.状态表示

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

2.状态转移方程 --根据最后一个位置的状况来划分问题

3.初始化  初始化第一行和第一列

第一行i=0时,s是空串,当j不断增大时,当第一次遇到不是*的就会匹配不成功,为false

第一列j=0时,p是空串,去匹配p的话,就会匹配不成功,为false

4.填表顺序   从上往下,从左往右

5.返回值   dp[m][n] 

具体代码:

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

 4.第四题

OJ传送门LeetCode<10>正则表达式匹配

画图分析:

使用动态规划解决

1.状态表示

dp[i][j]表示p[0,j]区间内的子串是否能匹配s[0,i]区间内的子串

2.状态转移方程------根据最后一个位置的状态,分情况讨论

3.初始化

初始化第一行和第一列

当i=0,s为空串,p必须保持偶数位为*,当第一次没有遇到*时,就初始化为false

当j=0,p为空串,去匹配s的话,都是不成功的,初始化为false

4.填表顺序

从上往下,从左往右

5.返回值    dp[m][n]

具体代码:

bool isMatch(string s, string p) {int m=s.size(),n=p.size();s=" "+s,p=" "+p;vector<vector<bool>> dp(m+1,vector<bool>(n+1));dp[0][0]=true;for(int j=2;j<=n;j+=2)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][j-2] || (p[j-1]=='.' || p[j-1]==s[i]) && dp[i-1][j];elsedp[i][j]=(p[j]==s[i] || p[j]=='.') && dp[i-1][j-1];}}return dp[m][n];}

 5.第五题

OJ传送门LeetCode<97>交错字符串

画图分析:

 使用动态规划解决

可以做个预处理,每个字符串添加一个空白字符

1.状态表示

dp[i][j]表示s1[1,i]区间内的字符串以及s2[1,j]区间内的字符串,能否拼接成s3[1,i+j]区间内的字符串

2.状态转移方程

3.初始化    初始化第一行和第一列

i=0即s1为空串,字符串s2与s3逐个往后匹配,当第一次遇到不匹配时,初始化为false

j=0即s2为空串,与上面一样

4.填表顺序    从上往下,从左往右

5.返回值    dp[m][n]

具体代码:

 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;else break;for(int i=1;i<=m;++i)//初始化第一列if(s1[i]==s3[i]) dp[i][0]=true;else break;for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)dp[i][j]=(s1[i]==s3[i+j] && dp[i-1][j])|| (s2[j]==s3[i+j] && dp[i][j-1]);return dp[m][n];}

 6.第六题

OJ传送门LeetCode<712>两个字符串的最小ASCII码删除和

画图分析:

 会发现当两个字符串删除完之后剩下的为公共子序列,而公共子序列有很多,根据题意,我们只需求出两个字符串里面所有的公共子序列中,ASCII码的最大和,即可满足最小删除和

使用动态规划解决

1.状态表示

dp[i][j]表示s1[0,i]区间以及s2[0,j]区间内的所有子序列中,公共子序列的ASCII最大和

2.状态转移方程

3.初始化

不管是i=0,还是j=0,公共子序列都是空串,ASCII为0,即初始化为0

4.填表顺序    从上往下,从左往右

5.返回值       求出两个字符串的和sum,再减去2*dp[m][n]

具体代码:

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){dp[i][j]=max(dp[i-1][j],dp[i][j-1]);if(s1[i-1]==s2[j-1])dp[i][j]=max(dp[i][j],dp[i-1][j-1]+s1[i-1]);}int sum=0;for(auto x:s1) sum+=x;for(auto x:s2) sum+=x;return sum-2*dp[m][n];}

 7.第七题

OJ传送门LeetCode<718>最长重复子数组

画图分析:

 对于本道题若继续采用以往的经验的话,因为求取的是连续的子数组,必须保证能跟在前面位置的后面,因此不能采用

1.状态表示

dp[i][j]表示:nums1中以i位置元素为结尾的所有子数组以及nums2中以j位置元素为结尾的所有子数组中,最长重复子数组的长度

2.状态转移方程

3.初始化

初始化第一行和第一列为0

4.填表顺序   从上往下填每一行

5.返回值    dp表中的最大值

具体代码:

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;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID &#xff1a; TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的&#xff0c;范围是 0 to 0xFFFE&#xff0c;0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级&#xff0c;ID越大&#…

WGCLOUD运维工具从入门到精通 - 如何设置主题背景

需要升级到WGCLOUD的v3.5.7或者以上版本&#xff0c;才会支持自定义设置主题背景色 WGCLOUD下载&#xff1a;www.wgstart.com 我们登录后&#xff0c;在右上角点击如下的小图标&#xff0c;就可以设置主题背景色了&#xff0c;包括&#xff1a;经典白&#xff08;默认&#x…

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的开发模式&#xff0c;但是也具有其特色的侦听函数&#xff0c;那么当LigerUI作为View层的时候&#xff0c;他所发送后端的必然是表单的数据&#xff0c;在此我们以俩个div为例&#xff1a; {Layout "~/View…

基于RIP的MGRE VPN综合实验

实验拓扑 实验需求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方&#xff1b; R3与R5之间使用HDLC封…

git的理解与使用

本地的git git除了最经典的add commit push用来做版本管理&#xff0c;其实他的分支管理也非常强大 可以说你学好了分支管理&#xff0c;就可以完成团队的配合协作了 git仓库 我们可以使用git init来初始化一个git仓库&#xff0c;只要能看见.git文件夹&#xff0c;就代表这…

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板&#xff08;这里面的exti.c文件没有how to use this driver 配置说明&#xff09; 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成&#xff0c;M3固定安装孔&#xff0c;有输出状态指示灯&#xff0c;输出高电平灯灭&#xff0c;输出…

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构&#xff0c;由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体&#xff08;如子 CA 或终端实体&#xff09;颁发证书。层级结构的顶端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整个 PKI 体…

【自然语言处理(NLP)】深度循环神经网络(Deep Recurrent Neural Network,DRNN)原理和实现

文章目录 介绍深度循环神经网络&#xff08;DRNN&#xff09;原理和实现结构特点工作原理符号含义公式含义 应用领域优势与挑战DRNN 代码实现 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 介绍 **自然语言处理&#xff08;Natural Language Pr…

Niagara学习笔记

橙色 发射器 , 绿色 粒子, 红色 渲染器 Emitter State 发射器状态 Life Cycle Mode&#xff08;生命周期模式&#xff09; 选择Self就是发射器自身管理生命周期 Loop Behavior 决定粒子发射次数 一次&#xff08;Once&#xff09;&#xff1a;发射器只播放一次多次&#…

2025数学建模美赛|F题成品论文

国家安全政策与网络安全 摘要 随着互联网技术的迅猛发展&#xff0c;网络犯罪问题已成为全球网络安全中的重要研究课题&#xff0c;且网络犯罪的形式和影响日益复杂和严重。本文针对网络犯罪中的问题&#xff0c;基于多元回归分析和差异中的差异&#xff08;DiD&#xff09;思…

适配Android16

Android16新特性 Android 16带来了许多新特性和改进&#xff0c;提升了系统的流畅度、用户体验和安全性。对于应用开发者来说&#xff0c;适配Android 16可以确保应用在该版本上的兼容性和性能&#xff0c;同时也可以利用其新特性为用户提供更好的服务。以下是Android 16的一些…

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时&#xff0c;从编码字符串中 每次读取一个字符 &#xff0c;并采取以下步骤&#xff1a; 如果所读的字符是…

ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

简介 在这个系列的上一篇文章中&#xff0c;我们介绍了ESP32 I2S音频总线的相关知识&#xff0c;简要了解了什么是I2S总线、它的通信格式&#xff0c;以及相关的底层API函数。没有看过上篇文章的可以点击文章进行回顾&#xff1a; ESP32 I2S音频总线学习笔记&#xff08;一&a…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

objection的简单使用

objection环境配置 下载以下版本 objection1.11.0 frida-tools9.2.4 python3.8.8 报错的话看这里: 在这个网站下载frida-tools14.2.18的离线包Links for frida 然后放入C:\Users\Asus\frida-14.2.18-py3.8-win-amd64.egg文件夹下 执行poetry add frida-tools14.2.18 ob…

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…

【Redis】缓存+分布式锁

目录 缓存 Redis最主要的使用场景就是作为缓存 缓存的更新策略&#xff1a; 1.定期生成 2.实时生成 面试重点&#xff1a; 缓存预热&#xff08;Cache preheating&#xff09;&#xff1a; 缓存穿透&#xff08;Cache penetration&#xff09; 缓存雪崩 (Cache avalan…

记录 | MaxKB创建本地AI智能问答系统

目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…

C#新语法

目录 顶级语句&#xff08;C#9.0&#xff09; using 全局using指令&#xff08;C#10.0&#xff09; using资源管理问题 using声明&#xff08;C#8.0&#xff09; using声明陷阱 错误写法 正确写法 文件范围的命名空间声明&#xff08;C#10.0&#xff09; 可空引用类型…