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

《算法题讲解指南:动态规划算法--子序列问题》--29.最长递增子序列的个数,30.最长数对链,31.最长定差子序列

小叶-duck个人主页❄️个人专栏《Data-Structure-Learning》《C入门到进阶自我学习过程记录》《算法题讲解指南》--优选算法《算法题讲解指南》--递归、搜索与回溯算法《算法题讲解指南》--动态规划算法✨未择之路不须回头已择之路纵是荆棘遍野亦作花海遨游目录29.最长递增子序列的个数题目链接题目描述题目示例解法(动态规划)算法思路C算法代码算法总结及流程解析30.最长数对链题目链接题目描述题目示例解法(动态规划)算法思路C算法代码算法总结及流程解析31.最长定差子序列题目链接题目描述题目示例解法(动态规划)算法思路C算法代码算法总结及流程解析结束语29.最长递增子序列的个数题目链接673. 最长递增子序列的个数 - 力扣LeetCode题目描述题目示例解法(动态规划)算法思路1.状态表示先尝试定义一个状态:以为结尾的最长递增子序列的「个数」。那么问题就来了我都不知道以i为结尾的最长递增子序列的「长度」是多少我怎么知道最长递增子序列的个数呢?因此我们解决这个问题需要两个状态一个是「长度」一个是「个数」len[i]表示以i为结尾的最长递增子序列的长度;count[i]表示以i为结尾的最长递增子序列的个数。2.状态转移方程求个数之前我们得先知道长度因此先看len[i]i.在求i 结尾的最长递增序列的长度时我们已经知道 [0i-1] 区间上的 len[j] 信息用 j 表示[0i-1]区间上的下标;ii.我们需要的是递增序列因此[0i-1]区间上的 nums[j]只要能和 nums[i]构成上升序列那么就可以更新dp[i]的值此时最长长度为dp[j]1;iii.我们要的是[0i-1]区间上所有情况下的最大值。综上所述对于几en[i]我们可以得到状态转移方程为len[i] max(len[j] 1,len[i])其中0 j i,并且nums[j] nums[i] 。在知道每一个位置结尾的最长递增子序列的长度时我们来看看能否得到count[i]i.我们此时已经知道len[i]的信息还知道[i-1]区间上的count[j]信息用j表示[0i-1]区间上的下标;ii.我们可以再遍历一遍[0i1]区间上的所有元素只要能够构成上升序列并且上升序列的长度等于dp[i]那么我们就把count[i]加上count[j]的值。这样循环一遍之后count[i]存的就是我们想要的值。综上所述对于count[i]我们可以得到状态转移方程为count[i] count[j]其中 j i并且nums[j] nums[i] dp[j] 1 dp[i]。3.初始化对于len[i]所有元素自己就能构成一个上升序列直接全部初始化为1;对于count[i]如果全部初始化为1在累加的时候可能会把「不是最大长度的情况」累加进去因此我们可以先初始化为0然后在累加的时候判断一下即可。具体操作情况看代码~4.填表顺序毫无疑问是「从左往右」。5.返回值用manLen 表示最终的最长递增子序列的长度。根据题目要求我们应该返回所有长度等于maxLen的子序列的个数。C算法代码class Solution { public: int findNumberOfLIS(vectorint nums) { int n nums.size(); vectorint len_dp(n, 1); vectorint count_dp(n, 1); int len 1; int count 1; for(int i 1; i n; i) { for(int j i - 1; j 0; j--) { if(nums[i] nums[j]) { // len_dp[i] max(len_dp[i], len_dp[j] 1); if(len_dp[i] len_dp[j] 1) { len_dp[i] len_dp[j] 1; count_dp[i] count_dp[j]; } else { if(len_dp[i] len_dp[j] 1) { count_dp[i] count_dp[j]; } } } } if(len len_dp[i]) { len len_dp[i]; count count_dp[i]; } else { if(len len_dp[i]) { count count_dp[i]; } } } // int len 0; // int count 0; // for(int i 0; i n; i) // { // if(len len_dp[i]) // { // len len_dp[i]; // count count_dp[i]; // } // else // { // if(len len_dp[i]) // { // count count_dp[i]; // } // } // } return count; } };算法总结及流程解析30.最长数对链题目链接646. 最长数对链 - 力扣LeetCode题目描述题目示例解法(动态规划)算法思路这道题目让我们在数对数组中挑选出来一些数对组成一个呈现上升形态的最长的数对链。像不像我们整数数组中挑选一些数让这些数组成一个最长的上升序列?因此我们可以把问题转化成我们学过的一个模型300.最长递增子序列。因此我们解决问题的方向应该在「最长递增子序列」这个模型上。不过与整形数组有所区别。在用动态规划结局问题之前应该先把数组排个序。因为我们在计算dp[i]的时候要知道所有左区间比pairs[i]的左区间小的链对。排完序之后只用「往前遍历一遍」即可。1.状态表示dp[i]表示以i 位置的数对为结尾时最长数对链的长度。2.状态转移方程对于dp[i]遍历所有[0i-1]区间内数对用j表示下标找出所有满足pairs[j][1]pairs[i][0]的j。找出里面最大的dp[j]然后加上1 就是以i位置为结尾的最长数对链。3.初始化刚开始的时候全部初始化为1。4.填表顺序根据「状态转移方程」填表顺序应该是「从左往右」。5.返回值根据「状态表示」返回整个dp表中的最大值。C算法代码class Solution { public: int findLongestChain(vectorvectorint pairs) { sort(pairs.begin(), pairs.end()); int n pairs.size(); vectorint dp(n, 1); int ret 1; for(int i 1; i n; i) { for(int j i - 1; j 0; j--) { if(pairs[j][1] pairs[i][0]) { dp[i] max(dp[i], dp[j] 1); } } ret max(ret, dp[i]); } // int ret 0; // for(int i 0; i n; i) // { // ret max(ret, dp[i]); // } return ret; } };算法总结及流程解析31.最长定差子序列题目链接1218. 最长定差子序列 - 力扣LeetCode题目描述题目示例解法(动态规划)算法思路这道题和300.最长递增子序列有一些相似但仔细读题就会发现本题的 arr.lenght 高达10^5 使用 O(N^2) 的 lcs 模型一定会超时。那么它有什么信息是300.最长递增子序列的呢? 是定差。之前我们只知道要递增不知道前一个数应当是多少就会导致可能前面的值忽大忽小所以我们需要把前面所有情况遍历一遍才能找到最大值现在我们可以计算出前一个数具体是多少了就可以用数值来定义dp数组的值并形成状态转移。这样就把已有信息有效地利用了起来。1.状态表示dp[i]表示以i位置的元素为结尾所有的子序列中最长的等差子序列的长度。2.状态转移方程:对于dp[i]上一个定差子序列的取值定为arr[i]-difference 。只要找到以上一个数字为结尾的定差子序列长度的dp[arr[i]-difference]然后加上1就是以i为结尾的定差子序列的长度。因此这里可以选择使用哈希表做优化。我们可以把「元素dp[j]」绑定放进哈希表中。甚至不用创建 dp 数组直接在哈希表中做动态规划。3.初始化刚开始的时候需要把第一个元素放进哈希表中hash[arr[0]]1 。4.填表顺序根据「状态转移方程」填表顺序应该是「从左往右」。5.返回值根据「状态表示」返回整个 dp 表中的最大值。C算法代码class Solution { public: int longestSubsequence(vectorint arr, int difference) { //创建一个哈希表利用哈希表实现动态规划 unordered_mapint, int hash; //arr[i] - dp[i] hash[arr[0]] 1; //初始化 int ret 1; for(int i 1; i arr.size(); i) { // if(hash[arr[i] - difference]) // { // hash[arr[i]] hash[arr[i] - difference] 1; // } // else // { // hash[arr[i]] 1; // } hash[arr[i]] hash[arr[i] - difference] 1; //如果arr[i] - difference在前面不存在则hash映射的值为0 //加上1也正好符合要求不需要额外判断 ret max(ret, hash[arr[i]]); } // int ret 0; // for(int i 0; i arr.size(); i) // { // ret max(ret, hash[arr[i]]); // } return ret; } };算法总结及流程解析结束语到此29.最长递增子序列的个数30.最长数对链31.最长定差子序列 这三道算法题就讲解完了。最长递增子序列个数通过维护长度和个数两个状态数组统计满足条件的序列数量.最长数对链转化为LIS问题并排序预处理最长定差子序列利用哈希表优化查找过程。三题均采用动态规划思想通过定义状态、转移方程、初始化和填表顺序解决问题其中第一题需同时跟踪长度和数量信息第三题利用哈希表实现O(1)查找。希望大家能有所收获

相关文章:

《算法题讲解指南:动态规划算法--子序列问题》--29.最长递增子序列的个数,30.最长数对链,31.最长定差子序列

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》《C入门到进阶&自我学习过程记录》 《算法题讲解指南》--优选算法 《算法题讲解指南》--递归、搜索与回溯算法 《算法题讲解指南》--动态规划算法 ✨未择之路&#xff0…...

2025届学术党必备的六大AI科研网站推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为能切实有效地把文本的AIGC检测概率给降低下来,得从业经历连贯性以及统计规律这…...

AI Agent Harness Engineering 零售场景应用:智能货架、库存管理与个性化推荐

AI Agent Harness Engineering 零售场景全栈应用:从智能货架机器人到千人千面实时导购 关键词 AI Agent Harness(智能体协同框架)、零售数字化、多模态智能体、强化学习库存调度、个性化推荐图谱、边缘云协同推理、供应链韧性优化 摘要 当传统“人-货-场”零售三要素被AI重…...

2025届毕业生推荐的十大AI论文平台推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在内容生产这个领域当中,过度去依赖AIGC会引发出来一系列的问题,这一…...

华为MateBook X Pro 2020款在Ubuntu系统中提升音质

华为MateBook X Pro 2020款在Ubuntu系统中可以达到相当不错的音质,但需要解决驱动兼容性问题并进行系统优化才能充分发挥其硬件潜力。 硬件音频配置 MateBook X Pro 2020款配备了4个扬声器(双高音喇叭双下沉式低音炮),支持杜比全…...

华为MateBook X Pro 2020款在Ubuntu系统中直接使用原生的杜比全景声效果

华为MateBook X Pro 2020款在Ubuntu系统中无法直接使用原生的杜比全景声效果,但可以通过软件模拟获得接近的音频体验。 硬件基础:杜比全景声系统 MateBook X Pro 2020款配备了华为与杜比联合设计的高低音分频四扬声器系统(双高音喇叭双下沉式…...

大模型系列(掩码注意力,KV Cache,GQA)

文章目录一. 掩码注意力二. KV Cache三. GQA (Grouped-Query Attention,分组查询注意力)一. 掩码注意力 假设我们正在训练一个语言模型(比如GPT),当前抓取到的一条训练数据是一句话:bos 我 爱吃 苹果(bos …...

AI时代的价值冲击——共识瓦解与转型阵痛

AI时代的价值冲击——共识瓦解与转型阵痛当我们将价值理解为“社会对效用增量的局部共识”时,人工智能对劳动力市场的冲击便呈现出全新的面貌。这场冲击的本质,并非简单的“机器替代人”,而是旧有的、基于工业时代劳动形态的价值共识体系正在…...

价值:社会对劳动所产生的效用增量形成的局部共识

价值:社会对劳动所产生的效用增量形成的局部共识在探讨经济学和政治经济学的核心问题时,“价值是什么”始终是一个无法绕开的根本追问。传统马克思主义劳动价值论认为,商品的价值由生产它所耗费的“社会必要劳动时间”决定,这是一…...

POJ1673——探索三角形垂心的几何奥秘与算法实现

1. 三角形垂心的几何本质 第一次接触POJ1673这道题时,我被题目中"垂心"这个概念卡住了。后来才发现,垂心其实就是三角形三个高线的交点。什么是高线?就是从三角形一个顶点向对边作垂线,这条垂线就是高线。有趣的是&…...

Gson序列化LocalDateTime的3种方案对比:原生支持vs自定义适配器vs第三方库

Gson序列化LocalDateTime的3种方案对比:原生支持vs自定义适配器vs第三方库 在Java生态中,时间日期处理一直是个让人头疼的问题。特别是当你需要将LocalDateTime这样的现代时间类型通过Gson进行JSON序列化时,往往会遇到各种兼容性问题。作为一…...

三步掌握Strawberry Perl:Windows Perl开发环境配置指南

三步掌握Strawberry Perl:Windows Perl开发环境配置指南 【免费下载链接】Perl-Dist-Strawberry Tooling to build and package releases for Perl on Windows. 项目地址: https://gitcode.com/gh_mirrors/pe/Perl-Dist-Strawberry 在Windows系统上进行Perl开…...

直流电机双闭环调速控制系统仿真模型 转速电流双闭环PI控制 Matlab/Simulink仿真模型 带报告

直流电机双闭环调速控制系统仿真模型 转速电流双闭环PI控制 Matlab/Simulink仿真模型 带报告在 Simulink 里搭建直流电机双闭环调速系统,而是通过连接模块来实现。这段代码会自动计算 PI 控制器的参数,DC_Motor_Dual_Loop 的仿真模型。 🛠️ …...

BetterJoy终极指南:在Windows电脑上完美使用Switch手柄玩游戏

BetterJoy终极指南:在Windows电脑上完美使用Switch手柄玩游戏 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitco…...

工程师实现TVA与MES系统无缝对接的实操要点

AI智能体视觉检测系统(TVA)与MES系统对接,是实现汽车零部件焊接点检测数据闭环管理的关键,作为负责对接工作的工程师,需熟悉两个系统的接口规范、数据传输协议,规范完成对接部署与调试,避免出现…...

工程师快速解决TVA检测系统常见故障的实操技巧

TVA系统在汽车零部件焊接点检测中需长期连续运行,适配高节拍生产场景,作为负责系统运维的工程师,快速排查与解决常见故障,是保障系统稳定运行的核心职责。在实际运维过程中,不少工程师因对故障原因判断不准确、排查方法…...

工程师提升TVA产品缺陷识别精度的实操指南

AI算法是TVA系统识别焊接点缺陷的核心,作为负责系统优化的工程师,算法优化的质量直接决定检测精度与效率。在汽车零部件焊接点检测中,由于缺陷种类繁杂(气孔、咬边、虚焊等)、形态多样、隐蔽性强,算法优化过…...

工程师实操:TVA系统硬件安装与调试的核心要点

作为负责TVA系统落地的工程师,硬件部署(安装、调试)是确保系统稳定运行、检测精度达标的基础。在汽车零部件焊接点检测场景中,由于焊接环境复杂(高粉尘、强电磁、高温度)、零部件形态多样,硬件部…...

如何通过智能字体处理实现前端优化:Fontmin实用指南

如何通过智能字体处理实现前端优化:Fontmin实用指南 【免费下载链接】fontmin Minify font seamlessly 项目地址: https://gitcode.com/gh_mirrors/fo/fontmin 问题引入:未优化字体的性能陷阱 在现代前端开发中,字体文件往往成为性能…...

一键生成专业工资条:工资条生成器功能详解

在当今数字化办公的时代,一款好的工具能够让工作效率得到质的提升。 工资条生成器就是这样一款专门为财务人员打造的专业工具,它集成了多项实用功能。 下面,就让我们来详细了解一下这款软件的各项功能特性。 首先要介绍的是软件的核心功能…...

Qt数据库连接实战:QSqlDatabase从配置到优化的完整指南

Qt数据库连接实战:QSqlDatabase从配置到优化的完整指南 在当今数据驱动的应用开发中,数据库连接作为系统与数据之间的桥梁,其稳定性和性能直接影响着用户体验。对于Qt开发者而言,QSqlDatabase作为连接各类数据库的核心类&#xff…...

树莓派Ubuntu系统无显示器配置全攻略:VNC远程桌面与虚拟显示器实战

1. 树莓派Ubuntu系统初始化配置 第一次接触树莓派的朋友可能会觉得这个小玩意儿很神奇,巴掌大的板子居然能跑完整的桌面系统。我当初拿到树莓派4B时也兴奋了好一阵子,但很快发现一个现实问题:不是每个人都有多余的显示器可以长期接在树莓派上…...

2025华中杯B题:校园共享单车调度与维护实战解析——从数据清洗到最优路径的完整建模指南

1. 校园共享单车数据清洗实战指南 第一次拿到共享单车数据时,我差点被那些"200"和空白单元格整崩溃了。这份数据就像被熊孩子玩过的拼图,需要我们一块块修复完整。数据清洗是建模的第一步,也是最容易被忽视的关键环节。 1.1 异常…...

AutoCAD转SolidWorks必看:用装配体功能优化树莓派小车结构的5个技巧

AutoCAD转SolidWorks必看:用装配体功能优化树莓派小车结构的5个技巧 从AutoCAD转向SolidWorks的设计师常会遇到一个关键挑战:如何将二维绘图思维转化为三维装配思维。上周一位机械工程师向我展示了他的树莓派小车AutoCAD图纸——虽然二维尺寸精确到毫米…...

DYOR 世茂集团 00813.HK

文章目录1. 公司概况:老牌闽系房企的沉浮1.1 简介1.2 股权结构1.2 核心资质与定位2. 财务表现:2025年成功扭亏为盈2.1 2025年核心财务数据2.2 收入结构变化:多元化成效显现2.3 偿债能力与流动性2.4 估值与市场表现3. 债务重组:境外…...

PlugY:暗黑破坏神2单机模式功能增强的高效解决方案

PlugY:暗黑破坏神2单机模式功能增强的高效解决方案 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY PlugY作为一款专为暗黑破坏神2单机模式设计的开源工具…...

APK Installer深度解析:Windows平台Android应用无缝安装的技术实现与实践指南

APK Installer深度解析:Windows平台Android应用无缝安装的技术实现与实践指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在跨平台应用生态日益融合的今…...

2026大模型训练全景,从底座到上线,决定AI体验的完整链路

在人工智能飞速发展的2026年,大众对大模型的认知早已不再停留在“参数越大越强”的简单层面。我们日常使用AI助手时感受到的流畅对话、精准指令响应、高效工具调用,甚至稳定可靠的输出风格,背后都不是单一的预训练环节在支撑,而是…...

3分钟突破网盘限速!Baiduwp-PHP实现百度网盘链接高速解析

3分钟突破网盘限速!Baiduwp-PHP实现百度网盘链接高速解析 【免费下载链接】baiduwp-php A tool to get the download link of the Baidu netdisk / 一个获取百度网盘分享链接下载地址的工具 项目地址: https://gitcode.com/gh_mirrors/ba/baiduwp-php 在数字…...

如何从零开始搭建Cubli_Mini自平衡机器人:终极完整指南

如何从零开始搭建Cubli_Mini自平衡机器人:终极完整指南 【免费下载链接】Cubli_Mini 项目地址: https://gitcode.com/gh_mirrors/cu/Cubli_Mini Cubli_Mini是一款令人惊叹的开源自平衡立方体机器人,它通过三个正交安装的飞轮实现姿态控制&#x…...