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

动态规划专题:00:线性动态规划:爬楼梯问题实例

一、线性动态规划的定义具有线性阶段划分的动态规划算法称为线性动态规划简称线性DP。若状态包含多个维度则每个维度都是线性划分的阶段也属于线性DP。1. 核心概念解读动态规划DP是一种解决复杂问题的高效算法思想其核心是将原问题分解为相对简单的子问题并通过保存子问题的解即“状态”来避免重复计算最终获得原问题的解。“线性”的含义这里的“线性”特指问题求解过程在阶段划分上是线性的、顺序的。就像一条线从起点初始状态开始按照明确的、不可跳跃的顺序阶段1 - 阶段2 - ... - 阶段n一步步推进到终点最终状态。整个决策过程形成一个清晰的“链条”。2. 示意图解构状态图中状态0状态1 ...状态n代表了在解决问题过程中各个“时间点”或“步骤点”的情况记录。状态0是初始状态状态n是目标状态。决策图中 每一个阶段都有每一个阶段的决策决策1决策2 ...决策n代表从前一个状态向后一个状态转移时我们所做出的选择。每个决策都会产生一定的“代价”或“收益”并导致状态发生变化。阶段图中底部的阶段1阶段2 ...阶段n 正是线性划分的体现。每个阶段对应一次“决策状态转移”的过程。阶段与阶段之间首尾相接顺序固定构成了线性的求解流程。流程总结整个算法从状态0初始条件出发在阶段1根据状态0做出决策1从而更新到状态1然后在阶段2 再基于状态1做出决策2 更新到状态2 如此线性推进直至在阶段n做出决策n后到达最终的状态n问题得以解决。3. 对“多维度状态”的说明定义的第二句话是理解的难点和关键。它指出即使状态包含多个维度例如用坐标(i, j)表示位置只要每个维度的变化是按线性顺序进行遍历或递推的就仍然属于线性DP。举例在经典的“数字三角形”问题中状态是二维的(i, j)表示第i行第j列。我们通常的求解顺序是从第一行开始一行一行线性遍历i地向下计算在每一行内可能从左到右或按特定顺序线性遍历j计算每个位置的最优值。虽然状态是二维的但两个维度i和j的变化过程本身都是线性、有序的阶段划分因此它依然是线性DP。总结线性动态规划是一种将问题建模为“多阶段决策过程”的算法模型其核心特征是阶段的线性、顺序依赖性。​ 无论状态是单一变量还是多维变量只要决策推进的“时间线”或“逻辑顺序”是线性的就可以用线性DP的思路来解决。图片中的示意图正是这一单向、链式决策过程的经典可视化表示。常见的最长上升子序列、背包问题、最短路径问题等都是线性DP的典型应用。实例讲解1 超级楼梯题目描述HDU2041一个楼梯共有M级台阶刚开始时我们站在第1级台阶上若每次只可以走上一级或二级台阶则要走上第M级台阶共有多少种走法输入第1行包含一个整数N表示测试用例的个数。然后是N行数据每行都包含一个整数M1≤M≤40表示楼梯的级数。输出对每个测试实例都输出不同走法的数量。输入样例 输出样例2 12 23二、题意讲解1. 问题理解这是一个经典的动态规划问题类似于斐波那契数列问题。我们需要计算从第1级台阶走到第M级台阶的不同走法数量约束条件是每次只能向上走1级或2级台阶起始位置是第1级台阶目标位置是第M级台阶2. 关键点分析当M1时已经在第1级不需要走有1种走法不动当M2时从第1级到第2级只能走1步1级有1种走法当M3时从第1级到第3级有两种方式先走1级到第2级再走1级到第3级直接走2级到第3级因此有2种走法三、解题思路讲解1. 数学递推关系设f(n)表示从第1级走到第n级的走法数则有以下递推关系f(1) 1f(2) 1f(n) f(n-1) f(n-2)当n ≥ 3时解释要到达第n级台阶可以从第n-1级走1步上来或者从第n-2级走2步上来。2. 递归方法直接使用递推公式进行递归计算但这种方法存在大量重复计算时间复杂度为O(2^n)效率较低。3. 动态规划方法使用数组存储中间结果避免重复计算时间复杂度为O(n)效率高。四、C完整代码实现#include iostream #include vector using namespace std; // 方法一递归实现带记忆化 // 递归函数计算从第1级走到第n级的走法数 int recursiveSolution(int n, vectorint memo) { // 基本情况 if (n 1) return 1; // 已经在第1级只有1种走法 if (n 2) return 1; // 从第1级到第2级只能走1级 // 如果已经计算过直接返回结果 if (memo[n] ! -1) return memo[n]; // 递归计算f(n) f(n-1) f(n-2) memo[n] recursiveSolution(n-1, memo) recursiveSolution(n-2, memo); return memo[n]; } // 方法二动态规划实现 // 动态规划函数计算从第1级走到第n级的走法数 int dpSolution(int n) { // 如果n1或n2直接返回 if (n 1) return 1; if (n 2) return 1; // 创建dp数组dp[i]表示从第1级走到第i级的走法数 vectorint dp(n 1, 0); // 初始化基本情况 dp[1] 1; // 从第1级到第1级有1种走法不动 dp[2] 1; // 从第1级到第2级只能走1级有1种走法 // 递推计算 for (int i 3; i n; i) { dp[i] dp[i-1] dp[i-2]; } return dp[n]; } // 方法三空间优化的动态规划 // 由于只需要前两个状态可以优化空间复杂度到O(1) int dpOptimizedSolution(int n) { if (n 1) return 1; if (n 2) return 1; int prev2 1; // f(n-2) int prev1 1; // f(n-1) int current; // f(n) for (int i 3; i n; i) { current prev1 prev2; prev2 prev1; prev1 current; } return current; } int main() { int N; // 测试用例个数 cin N; // 存储所有测试用例 vectorint testCases(N); // 读取所有测试用例 for (int i 0; i N; i) { cin testCases[i]; } cout 递归方法带记忆化结果 endl; for (int i 0; i N; i) { int M testCases[i]; // 创建记忆化数组初始值为-1表示未计算 vectorint memo(M 1, -1); cout M M : recursiveSolution(M, memo) endl; } cout \n 动态规划方法结果 endl; for (int i 0; i N; i) { int M testCases[i]; cout M M : dpSolution(M) endl; } cout \n 空间优化的动态规划结果 endl; for (int i 0; i N; i) { int M testCases[i]; cout M M : dpOptimizedSolution(M) endl; } // 运行题目示例 cout \n 题目示例运行结果 endl; cout 输入 endl; cout 2 endl; cout 2 endl; cout 3 endl; cout \n输出 endl; vectorint memo1(3, -1); cout dpSolution(2) endl; // 输出1 cout dpSolution(3) endl; // 输出2 return 0; }五、代码详细讲解1. 递归方法带记忆化int recursiveSolution(int n, vectorint memo)参数n目标台阶级数memo记忆化数组存储已计算的结果避免重复计算实现原理基础情况n1或n2时直接返回结果递归情况f(n) f(n-1) f(n-2)记忆化将计算结果存入memo数组下次直接使用时间复杂度O(n)因为有记忆化每个f(n)只计算一次空间复杂度O(n)用于存储memo数组和递归调用栈2. 动态规划方法int dpSolution(int n)实现原理创建dp数组dp[i]表示从第1级走到第i级的走法数初始化dp[1]1, dp[2]1状态转移dp[i] dp[i-1] dp[i-2]最终返回dp[n]时间复杂度O(n)需要遍历1到n空间复杂度O(n)用于存储dp数组3. 空间优化的动态规划int dpOptimizedSolution(int n)实现原理由于递推公式只依赖前两个状态不需要保存整个dp数组使用三个变量prev2(f(n-2)), prev1(f(n-1)), current(f(n))每次迭代更新这三个变量时间复杂度O(n)空间复杂度O(1)只使用固定数量的变量4. 主函数int main()读取测试用例个数N读取N个测试用例台阶级数M分别用三种方法计算并输出结果最后运行并输出题目示例六、运行示例对于输入样例2 2 3程序输出 递归方法带记忆化结果 M 2: 1 M 3: 2 动态规划方法结果 M 2: 1 M 3: 2 空间优化的动态规划结果 M 2: 1 M 3: 2 题目示例运行结果 输入 2 2 3 输出 1 2七、复杂度对比方法时间复杂度空间复杂度优点缺点朴素递归O(2^n)O(n)实现简单大量重复计算效率极低记忆化递归O(n)O(n)避免重复计算需要额外存储空间动态规划O(n)O(n)逻辑清晰无递归开销需要O(n)数组空间优化动态规划O(n)O(1)空间最优逻辑稍复杂八、扩展思考如果每次可以走1级、2级或3级台阶递推公式变为f(n) f(n-1) f(n-2) f(n-3)如果起始位置不是第1级需要修改初始条件如果M很大如10^9需要使用矩阵快速幂方法将时间复杂度降到O(log n)这个超级楼梯问题是理解递归和动态规划的经典例题掌握了这个问题的解法对于理解更复杂的动态规划问题有很大帮助。

相关文章:

动态规划专题:00:线性动态规划:爬楼梯问题实例

一、线性动态规划的定义具有线性阶段划分的动态规划算法称为线性动态规划(简称线性DP)。若状态包含多个维度,则每个维度都是线性划分的阶段,也属于线性DP。1. 核心概念解读动态规划(DP):是一种解…...

k2与icefall环境搭建全攻略:从零开始配置语音识别开发环境

1. 环境准备:从零搭建语音识别开发环境 刚接触语音识别开发时,我被各种框架和依赖搞得晕头转向。直到发现了k2和icefall这对黄金组合,它们让语音识别模型的训练和部署变得简单高效。k2是一个基于CUDA的高效语音识别库,而icefall则…...

别再只用iframe了!Dify官方SDK嵌入Vue/React项目保姆级教程(附样式自定义)

深度整合Dify官方SDK:Vue/React项目中的现代化AI组件嵌入方案 1. 为什么选择SDK而非iframe?技术选型的深度思考 在将AI能力嵌入前端项目时,许多开发者会条件反射般选择iframe方案,这确实是最快上手的解决方案。但当我们面对需要高…...

TensorRT-LLM加速Qwen-VL多模态推理:从视觉特征注入到文本生成全流程解析

1. Qwen-VL多模态模型与TensorRT-LLM的化学反应 当视觉大模型遇上推理加速框架,会产生怎样的火花?Qwen-VL作为通义千问系列中的多模态明星模型,其独特的视觉-语言联合推理能力在实际业务场景中表现出色。但真正让它在工业级应用中大放异彩的&…...

通义千问3-Reranker-0.6B效果展示:多语言文本排序质量对比

通义千问3-Reranker-0.6B效果展示:多语言文本排序质量对比 1. 引言 在信息检索和智能问答系统中,文本排序模型的质量直接影响着用户体验。一个好的排序模型能够从海量候选文档中精准找出最相关的内容,让用户快速获得所需信息。通义千问3-Re…...

智能客服前端模板的架构设计与性能优化实战

在智能客服系统的前端开发过程中,我们常常会陷入一种“重复造轮子”的困境。每个新项目似乎都要从头搭建聊天窗口、消息列表、输入框和状态管理逻辑,这不仅消耗大量开发时间,还容易引入性能问题和维护难题。今天,我想分享一套我们…...

卡尔曼滤波在VBOX GNSS/INS系统中的关键作用与动态坡度测量优化

1. 卡尔曼滤波:GNSS/INS系统的"智能大脑" 第一次接触VBOX设备时,我被它实时输出的高精度坡度数据震撼到了——车辆在颠簸路面上急加速时,仪表盘上显示的俯仰角曲线依然稳如老狗。后来拆解其技术原理才发现,这套系统的灵…...

OpCore-Simplify:3步搞定黑苹果EFI配置,告别48小时手动调试的自动化方案

OpCore-Simplify:3步搞定黑苹果EFI配置,告别48小时手动调试的自动化方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于黑…...

2026年3月GESP真题及题解(C++七级): 选择题和判断题(题解)

2026年3月GESP真题及题解(C七级): 选择题和判断题(题解) 第1题 假设一个算法时间复杂度为递推式是 T(n)2T(n−1)1T(n) 2T(n - 1) 1T(n)2T(n−1)1 ( n 为正整数),且 T(0)1T(0) 1T(0)1 ,那么这个算法的时…...

Windows 11终极性能优化指南:Win11Debloat免费系统清理工具完整使用教程

Windows 11终极性能优化指南:Win11Debloat免费系统清理工具完整使用教程 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种…...

树莓派4B编程实战:从Python到C语言的跨语言开发技巧

树莓派4B编程实战:从Python到C语言的跨语言开发技巧 树莓派4B作为一款性能强劲的单板计算机,已经成为开发者们实现创意项目的首选平台。无论是物联网设备、机器人控制还是多媒体中心,树莓派都能胜任。但在实际开发中,我们常常面临…...

Ubuntu 22.04 LTS 一站式Java开发环境部署:从OpenJDK安装到JAVA_HOME全局配置

1. 为什么选择Ubuntu 22.04 LTS作为Java开发环境 Ubuntu 22.04 LTS作为长期支持版本,提供了长达5年的安全更新和技术支持,这对于需要稳定开发环境的Java程序员来说至关重要。我去年接手一个企业级Spring Cloud项目时,就深刻体会到LTS版本的价…...

从Seurat RDS文件解析单细胞数据:meta.data检查与下游分析实战指南

1. 理解Seurat RDS文件的基本结构 当你拿到一个Seurat RDS文件时,首先要明白它是什么。简单来说,RDS是R语言特有的数据存储格式,相当于把整个Seurat对象打包保存成一个文件。这就像把一整套单细胞分析的所有数据和结果都装进了一个盒子里&…...

最优化实践——Armijo准则在梯度下降中的步长策略

1. 为什么我们需要Armijo准则? 想象一下你在下山,眼前有两条路:一条坡度很陡但距离短,另一条坡度平缓但绕远路。固定步长的梯度下降就像闭着眼睛每步走固定距离——要么可能因为步子太大直接冲过山谷(发散)…...

ZED相机视频录制全攻略:从SVO格式到NVENC硬件加速(附Python代码示例)

ZED相机视频录制全攻略:从SVO格式到NVENC硬件加速(附Python代码示例) 立体视觉技术正在重塑计算机视觉领域的工作流程,而ZED相机作为行业标杆设备,其视频录制功能的高效利用直接关系到后期分析的质量与效率。本文将深入…...

基于springboot外卖商家管理系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍:CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…...

Windows 11终极优化指南:Win11Debloat一键提升系统性能51%

Windows 11终极优化指南:Win11Debloat一键提升系统性能51% 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化…...

孔祥仁高数网课精华笔记:如何高效掌握渐近线与定理三四?

孔祥仁高数网课精华笔记:如何高效掌握渐近线与定理三四? 高等数学中,渐近线与定理三四是许多学生感到困惑的难点。这些概念不仅抽象,而且在解题过程中需要灵活运用。本文将结合孔祥仁老师的网课精华,为你梳理高效掌握这…...

从扫地机器人到AGV:差速底盘MPC控制在实际项目中的调参心得与避坑指南

从扫地机器人到AGV:差速底盘MPC控制实战调参与工程避坑指南 差速底盘机器人在仓储AGV、服务机器人等场景的应用越来越广泛,而模型预测控制(MPC)因其优秀的路径跟踪性能成为主流控制算法。但在实际部署中,工程师们常会遇…...

MM5451 LED驱动芯片原理与嵌入式精准控制实践

1. MM5451 LED驱动芯片库技术解析与嵌入式工程实践1.1 芯片定位与系统级价值MM5451 是一款由 Fairchild(现属 ON Semiconductor)推出的串行输入、恒流输出型 LED 驱动专用集成电路,专为高亮度、多段位数码管显示控制而设计。其核心价值在于以…...

新手必看!Python逻辑运算符的5个易错点及避坑指南(附测试题)

Python逻辑运算符实战:从入门到精通的5个关键陷阱与解决方案 刚接触Python编程时,逻辑运算符看似简单,却暗藏玄机。许多初学者在条件判断、循环控制等场景中频频踩坑而不自知。本文将深入剖析and、or、not三大逻辑运算符的典型误用场景&#…...

AI头像生成器实操手册:导出CSV格式Prompt库,对接Notion/Airtable知识库

AI头像生成器实操手册:导出CSV格式Prompt库,对接Notion/Airtable知识库 1. 为什么需要AI头像生成器 你是不是经常为找不到合适的头像而烦恼?或者想用AI绘图工具制作专属头像,却不知道该怎么描述?AI头像生成器就是来解…...

快递鸟物流API实战:3大核心功能深度解析与电商物流效率提升指南

1. 快递鸟物流API:电商物流的智能加速器 做电商的朋友都知道,物流环节是最让人头疼的。去年双11,我们团队就因为物流问题差点崩溃——订单暴增导致发货延迟,客服被催单电话打爆,退货率直接飙升。后来接入快递鸟API后&a…...

自动化写作助手:OpenClaw+Qwen3.5-9B生成技术文章草稿

自动化写作助手:OpenClawQwen3.5-9B生成技术文章草稿 1. 为什么需要自动化写作助手 作为一个技术博主,我经常面临这样的困境:明明积累了大量实践经验,却总是卡在"如何把零散知识点组织成结构化的文章"这个环节。传统的…...

你的电动车电池还能用多久?聊聊BMS里SOH和RUL预测的那些“黑科技”

你的电动车电池还能用多久?聊聊BMS里SOH和RUL预测的那些“黑科技” 每次给电动车充电时,你是否会盯着电量百分比发呆:这个数字背后,电池真实的健康状况究竟如何?就像人类需要定期体检一样,电池管理系统&…...

MiniMax-M2.1:释放自主应用开发的AI潜能

MiniMax-M2.1:释放自主应用开发的AI潜能 【免费下载链接】MiniMax-M2.1 从多语言软件开发自动化到复杂多步骤办公流程执行,MiniMax-M2.1 助力开发者构建下一代自主应用——全程保持完全透明、可控且易于获取。 项目地址: https://ai.gitcode.com/MiniM…...

幻境·流金开源镜像实操:BF16精度适配A10/A100显卡部署教程

幻境流金开源镜像实操:BF16精度适配A10/A100显卡部署教程 “流光瞬息,影画幻成。” 你是否曾幻想过,只需一个念头,就能让脑海中的瑰丽景象瞬间化为一张细节丰沛、质感高级的影像?无论是赛博都市的霓虹流影,…...

深度强化学习实战:DDPG与A3C在Pendulum-v0环境中的性能对比与调优策略

1. Pendulum-v0环境解析 倒立摆问题就像教一个机器人玩平衡木游戏,系统需要不断调整力矩让杆子保持直立。Pendulum-v0作为Gym工具包中的经典控制环境,完美模拟了这个物理过程。我第一次接触这个环境时,发现它的状态空间设计非常巧妙——用三角…...

ESP32安全OTA固件升级框架:WiFi_FirmwareUpdater详解

1. WiFi_FirmwareUpdater:面向嵌入式开发者的安全固件在线升级方案WiFi_FirmwareUpdater 是一个专为 ESP32 系列微控制器设计的轻量级、可移植、开发者友好的固件空中升级(OTA, Over-The-Air)软件包。它并非简单的 HTTP 下载工具,…...

快速搭建Python3.10开发环境:Miniconda镜像实战体验分享

快速搭建Python3.10开发环境:Miniconda镜像实战体验分享 1. 为什么选择Miniconda-Python3.10镜像 Python作为当今最流行的编程语言之一,版本管理一直是开发者面临的挑战。传统Python安装方式存在以下痛点: 版本冲突:系统预装Py…...