动态规划<九>两个数组的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;}相关文章:
动态规划<九>两个数组的dp
目录 引例 LeetCode经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门LeetCode<1143>最长公共子序列 画图分析: 使用动态规划解决 1.状态表示 ------经验题目要求 经验为选取第一个字符串的[0,i]区间以及第二个字…...
浅析百度AOI数据与高德AOI数据的差异性
目录 前言 一、AOI属性数据 1、百度AOI数据 2、高德AOI数据 二、AOI矢量边界 1、百度AOI空间范围 2、高德AOI空间范围 三、数据获取频次和难易程度 1、接口限制 2、数据转换成本 四、总结 前言 在当今数字化时代,地理信息数据的精准性和丰富性对于城市规划…...
白平衡与色温:摄影中的色彩密码
目录 一、色温:光线的色彩温度 (一)色温的定义与原理 (二)常见光源的色温 (三)相机色温与环境色温 二、白平衡:还原真实色彩的关键 (一)白平衡的定义与…...
【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例
目录 说明举例 说明 简单来说,android:layout_weight为当前控件按比例分配剩余空间。且单个控件该属性的具体数值不重要,而是多个控件的属性值之比发挥作用,例如有2个控件,各自的android:layout_weight的值设为0.5和0.5࿰…...
深度学习|表示学习|卷积神经网络|参数共享是什么?|07
如是我闻: Parameter Sharing(参数共享)是卷积神经网络(CNN)的一个重要特性,帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说,在卷积层中,卷积核的参数&…...
【25考研】人大计算机考研复试该怎么准备?有哪些注意事项?
人大毕竟是老牌985,复试难度不会太低!建议同学认真复习!没有机试还是轻松一些的! 一、复试内容 由公告可见,复试包含笔试及面试,没有机试! 二、参考书目 官方无给出参考书目,可参照…...
国内优秀的FPGA设计公司主要分布在哪些城市?
近年来,国内FPGA行业发展迅速,随着5G通信、人工智能、大数据等新兴技术的崛起,FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此,国内优秀的FPGA设计公司主要分布在哪些城市&a…...
DeepSeek-R1:将强化学习用于激励大型语言模型的推理能力
目录 引言 一、DeepSeek-R1的贡献 二、DeepSeek-R1的方法 2.1、DeepSeek-R1-Zero:基础模型上的强化学习 2.2、DeepSeek-R1:冷启动强化学习 2.3、蒸馏:赋予小模型推理能力 三、DeepSeek-R1实验结果 3.1、模型优点 3.2、模型缺点 四、…...
深入探索 HTML5 拖拽效果 API:打造流畅交互体验
在现代的 Web 开发中,交互性和用户体验一直是开发者关注的重点。HTML5 的拖拽效果 API (Drag and Drop API) 提供了一种非常直观的方式来让网页元素或文件能够被拖动并放置到页面的指定位置,极大提升了用户的交互体验。本篇文章将深入探讨如何使用 HTML5…...
DPO、KTO、DiffusionDPO
DPO(Direct Preference Optimization) 原文来自于 https://arxiv.org/pdf/2305.18290, Bradley-Terry (BT)模型,假设人的喜欢遵循下面的公式,给定x,得到 y 1 y_1 y1和 y 2 y_2 y2分别遵循以下关系&am…...
分享|instructionfine-tuning 指令微调是提高LLM性能和泛化能力的通用方法
《生成式AI导论》课程中,李宏毅老师提到一篇关于“ instruction fine-tuning” 指令微调的论文: 《Scaling Instruction-Finetuned Language Models》 摘要分享: 事实证明, 在一组以指令形式表达的数据集上微调语言模型可以提…...
人工智能在教育中的创新应用:打造未来的智慧课堂
人工智能在教育中的创新应用:打造未来的智慧课堂 在快速发展的科技时代,人工智能(AI)正悄无声息地改变着教育的面貌。从个性化学习到智能课堂管理,AI技术为教育带来了前所未有的创新与效率提升。今天,我想从实际应用的角度,聊聊人工智能如何帮助我们构建更智慧的教育生…...
Go优雅实现redis分布式锁
前言 系统为了保证高可用,通常会部署多实例,并且会存在同时对共享资源并发读写,这时候为了保证读写的安全,常规手段是会引入分布式锁,本文将介绍如何使用redis设计一个优雅的Go分布式锁。 设计 redis分布式锁是借助…...
过年之无用知识研究:std::pair源码:operator=被delete了,提供的是sfinae版本
D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\utility pair& operator(const volatile pair&) delete;真正版本:template<class _Other1 _Ty1,class _Other2 _Ty2,enable_if_t<conjunction_v<is_assignable<_Ty1&, const _Oth…...
Mac Electron 应用签名(signature)和公证(notarization)
在MacOS 10.14.5之后,如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核,来判断是否存在病毒),那么就不能被安装。当然现在很多人的解决方案都是使用sudo spctl --master-disable,取消验证模式&#…...
C#@符号在string.Format方法中作用
本文详解@符号在string.Format方法中作用。...
C++学习——认识和与C的区别
目录 前言 一、什么是C 二、C关键字 三、与C语言不同的地方 3.1头文件 四、命名空间 4.1命名空间的概念写法 4.2命名空间的访问 4.3命名空间的嵌套 4.4命名空间在实际中的几种写法 五、输入输出 5.1cout 5.2endl 5.3cin 总结 前言 开启新的篇章,这里…...
简单的停车场管理系统的C语言实现示例
以下是一个简单的停车场管理系统的C语言实现示例。该示例使用结构体来管理停车场的车位信息,并提供基本车辆进入、离开以及显示停车场状态功能。 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_SLOTS 10 // 最大车位数…...
基于Django的豆瓣影视剧推荐系统的设计与实现
【Django】基于Django的豆瓣影视剧推荐系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用了Python作为后端开发语言,采用Django作为后端架构,结…...
【elasticsearch】如何更新许可证(License)
在 Elasticsearch 中,**许可证(License)** 用于控制集群的功能和权限。Elasticsearch 提供了多种许可证类型,包括 **Basic(免费)**、**Trial(试用)** 和 **订阅许可证(如…...
Open FPV VTX开源之ardupilot双OSD配置摄像头
Open FPV VTX开源之ardupilot双OSD配置 1 源由2. 分析3. 配置4. 解决办法5. 参考资料 1 源由 鉴于笔者这台Mark4 Copter已经具备一定的历史,目前机载了两个FPV摄像头: 模拟摄像头数字摄像头(OpenIPC) 测试场景: 从稳定性的角度࿱…...
【岛屿个数——BFS / DFS,“外海”】
题目 推荐阅读 AcWing 4959. 岛屿个数(两种解法,通俗解释) - AcWing 1.岛屿个数 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second int dx4[4] {-1, 0, 1, 0}, dy4[4] …...
《STL基础之vector、list、deque》
【vector、list、deque导读】vector、list、deque这三种序列式的容器,算是比较的基础容器,也是大家在日常开发中常用到的容器,因为底层用到的数据结构比较简单,笔者就将他们三者放到一起做下对比分析,介绍下基本用法&a…...
航空客户价值的数据挖掘与分析(numpy+pandas+matplotlib+scikit-learn)
文章目录 航空客户价值的数据挖掘与分析(numpy+pandas+matplotlib+scikit-learn)写在前面背景与挖掘目标1.1 需求背景1.2 挖掘目标1.3 项目概述项目分析方法规划2.1 RFM模型2.2 LRFMC模型指标2.3 分析总体流程图数据抽取探索及预处理3.1 数据抽取3.2 数据探索分析3.3 数据预处…...
基于Flask的豆瓣电影可视化系统的设计与实现
【FLask】基于Flask的豆瓣电影可视化系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网技术的飞速发展,影视剧行业的数据量呈爆炸性增长,其中影…...
系统设计的
软件设计的概念 定义:系统货组件的架构,构件,接口和其他特性 用户需求与软件技术的桥梁 设计工程活动 分解设计:将设计映射为各个部分 设计模型 好设计的特点是: 设计质量的属性: 功能性,易用性&am…...
C++中函数返回值当引用
文章目录 一、概述二、返回值当引用的基本语法三、返回局部变量的引用四、返回引用的常见用途五、返回右值引用六、总结 一、概述 在 C 中,函数返回值当引用(即返回引用)是一个常见的编程技巧。它可以让你返回一个函数内部的局部变量或对象的…...
LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]
LosslessScaling 链接:https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"...
【JS|第28期】new Event():前端事件处理的利器
日期:2025年1月24日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方…...
Blazor-Blazor Web App项目结构
让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…...
