动态规划解爬楼梯问题:从递归到矩阵快速幂

爬楼梯问题的几种解法 ----动态规划(递进与滚动数组) + 矩阵快速幂解法 问题 普通的动态规划 ----递归 由于最后一步一定是跳一阶或者两阶台阶,所以f(n) = f(n-1) + f(n-2), 这里复杂的问题变成了子问题求解,符合动态规划的使用条件,所以这道题可以用动态规划来做,递归代码如下: public int function(int n){ if(n==0||n==1){ //当台阶只有零阶一阶时只有一种走法。 return 1; } return function(n-1)+function(n-2); } 改进 ----滚动数组 上面的这种递归的 阅读详情

1. 问题背景与核心思路

爬楼梯问题是一个经典的算法入门题目,也是理解动态规划思想的绝佳案例。假设你正在爬楼梯,每次可以跨1个或2个台阶,问到达第n个台阶有多少种不同的方法?这个看似简单的问题背后蕴含着递归、数学归纳和动态规划等多个计算机科学核心概念。

我第一次接触这个问题是在准备技术面试时,当时被要求用多种方法实现。最直观的递归解法虽然简单,但在n较大时会出现严重的性能问题。后来通过引入动态规划优化,执行时间从指数级降到了线性级,这个优化过程让我深刻理解了算法优化的艺术。

2. 基础解法:递归思路分析

2.1 问题分解与递推关系

当我们站在第n个台阶时,只可能是从第n-1个台阶跨1步上来,或者从第n-2个台阶跨2步上来。因此,到达第n个台阶的方法数f(n) = f(n-1) + f(n-2)。这就是斐波那契数列的递推关系。

def climbStairs(n):
    if n == 1: return 1
    if n == 2: return 2
    return climbStairs(n-1) + climbStairs(n-2)

2.2 递归解法的问题

虽然递归解法直观易懂,但存在严重的性能缺陷。以n=5为例,计算过程会重复计算f(3)、f(2)等子问题。时间复杂度达到O(2^n),空间复杂度O(n)(调用栈深度)。

实际测试:当n=40时,普通递归解法在我的笔记本上需要约30秒才能计算出结果,完全无法满足实际需求。

3. 动态规划优化方案

3.1 动态规划基本思想

动态规划通过存储子问题的解来避免重复计算,通常有两种实现方式:

  1. 自顶向下的记忆化搜索(Memoization)
  2. 自底向上的迭代方法

3.2 记忆化搜索实现

def climbStairs(n):
    memo = {}
    def helper(n):
        if n in memo: return memo[n]
        if n == 1: return 1
        if n == 2: return 2
        memo[n] = helper(n-1) + helper(n-2)
        return memo[n]
    return helper(n)

这种方法的时间复杂度降为O(n),因为每个子问题只计算一次。空间复杂度O(n)用于存储备忘录。

3.3 迭代法实现

更高效的方式是自底向上计算,只需要存储前两个状态:

def climbStairs(n):
    if n == 1: return 1
    a, b = 1, 2
    for _ in range(2, n):
        a, b = b, a + b
    return b

这种方法的空间复杂度优化到O(1),只使用常数空间,是面试中最推荐的写法。

4. 数学方法与性能极限

4.1 斐波那契数列通项公式

爬楼梯问题实质是求斐波那契数列的第n+1项。斐波那契数列有精确的数学公式:

f(n) = [ (1+√5)/2 ]^n / √5 - [ (1-√5)/2 ]^n / √5

但由于浮点数精度问题,直接计算在n较大时会出现误差。

4.2 矩阵快速幂解法

更高效的是O(logn)的矩阵快速幂方法:

def climbStairs(n):
    def matrix_pow(mat, power):
        result = [[1,0],[0,1]]
        while power > 0:
            if power % 2 == 1:
                result = matrix_mult(result, mat)
            mat = matrix_mult(mat, mat)
            power //= 2
        return result
    
    def matrix_mult(a, b):
        return [
            [a[0][0]*b[0][0] + a[0][1]*b[1][0],
             a[0][0]*b[0][1] + a[0][1]*b[1][1]],
            [a[1][0]*b[0][0] + a[1][1]*b[1][0],
             a[1][0]*b[0][1] + a[1][1]*b[1][1]]
        ]
    
    if n == 1: return 1
    mat = [[1,1],[1,0]]
    result = matrix_pow(mat, n-1)
    return result[0][0]

这种方法虽然代码复杂,但在处理极大n时(如n=10^18)仍能快速计算。

5. 变种问题与实际应用

5.1 步数限制变化

如果每次可以走1、2或3步,递推关系变为f(n)=f(n-1)+f(n-2)+f(n-3)。动态规划思路依然适用,只需调整状态转移方程。

def climbStairs(n):
    if n == 1: return 1
    if n == 2: return 2
    if n == 3: return 4
    a, b, c = 1, 2, 4
    for _ in range(3, n):
        a, b, c = b, c, a + b + c
    return c

5.2 带障碍物的爬楼梯

在二维网格中爬行,某些格子有障碍物,求从起点到终点的路径数。这是动态规划的经典二维扩展。

5.3 实际工程应用

爬楼梯问题的解法思想广泛应用于:

  • 金融领域的期权定价
  • 生物信息学的序列比对
  • 网络路由选择算法
  • 游戏中的路径规划

6. 面试技巧与注意事项

6.1 面试常见考察点

面试官通常会:

  1. 先要求写递归解法
  2. 然后问如何优化
  3. 最后可能扩展到变种问题

6.2 代码实现细节

  • 边界条件处理:n=0或1时的返回值
  • 变量命名清晰:用prev, curr比a,b更易读
  • 空间优化解释:能清楚说明为什么可以压缩状态

6.3 常见错误

  1. 忘记处理n=0的情况(视题目要求而定)
  2. 递归版本没有记忆化导致超时
  3. 迭代法初始条件设置错误
  4. 变量交换顺序错误导致状态更新不正确

7. 性能测试与对比

我在LeetCode上对不同解法进行了实测(n=45):

方法 执行时间 内存消耗
朴素递归 >10秒 O(n)
记忆化搜索 32ms O(n)
迭代法 28ms O(1)
矩阵快速幂 30ms O(1)

实际工程中,迭代法通常是最佳选择,除非有特别大的n需求。

8. 扩展思考与练习建议

要真正掌握动态规划,建议:

  1. 先手算小规模案例,理解状态转移
  2. 画出递归树,观察重复子问题
  3. 从递归→记忆化→迭代逐步优化
  4. 尝试类似题目:斐波那契、零钱兑换、最长递增子序列等

我在学习过程中发现,把状态转移方程用数学形式明确写出来,能大幅提高解题成功率。对于二维动态规划,画表格辅助思考也非常有效。

动态规划解爬楼梯问题:从递归到斐波那契 动态规划是解决最优化问题的经典算法范式,其核心思想是将复杂问题分解为重叠子问题。以爬楼梯问题为例,每次可跨1或2个台阶,求到达第n阶的方法数。这个问题实质上是斐波那契数列的变体,展现了递归与动态规划的内在联系。通过记忆化技术优化递归解法,可将时间复杂度从O(2^n)降至O(n)。进一步采用自底向上的动态规划方法,不仅能提升性能,还能通过状态压缩优化空间复杂度。这类问题在技术面试中极为常见,既能考察算法基础,又能延伸讨论时间/空间复杂度优化策略。掌握动态规划解题模式,对解决背包问题、路径规划等实际工程问题具有 阅读详情

相关推荐

爬楼梯与动态规划:从递归到矩阵快速幂的完整演进

动态规划是算法面试中的核心思想,而爬楼梯问题正是理解递推与状态转移的最佳入门案例。从最基本的斐波那契数列出发,爬楼梯揭示了“最后一步”的拆解思维:到达第n级台阶的方法数等于前两级方法数之和。递归解法直观但存在大量重复计算,时间复杂度高达O(2^n);通过记忆化搜索或自底向上的迭代DP,可优化至O(n)。进一步借助滚动数组还能将空间压缩到O(1),而面对超大n时,矩阵快速幂则提供O(log n)的高效方案。这类递推优化技术广泛应用于路径计数、编辑距离、背包问题等场景,是构建算法思维的关键基石。

weixin_31236101的博客 322

leetcode刷题笔记 70.爬楼梯【简单】

1、迭代 int climbStairs(int n) { if (n == 1) return 1; if (n == 2) return 2; int t1 = 1, t2 = 2; for (int i = 2; i < n; i++) { t2 = t1 + t2; t1 = t2 - t1; } return t2; } 时间:O(n) 空间:O(1) 2、递归 时间:O(2^n) 3、直接解递推公式 时间:O(1) 3、矩阵快速幂 需要满足齐次线性递推(部分

weixin_46477226的博客 118

爬楼梯与动态规划:从递归到矩阵快速幂的Java全解析

递推算法是计算机科学中的基础思维模型,它通过将复杂问题拆解为相似子问题来降低求解难度。动态规划作为递推思想的核心实现,在路径计数、资源调度、最优化决策等场景中应用广泛,其本质是记录已计算的状态以避免重复劳动。理解状态转移方程与空间压缩技巧,是提升算法能力的关键一步。从最简单的线性递推出发,可以通过滚动数组将空间复杂度优化至常数级别,也能借助矩阵快速幂将时间复杂度从线性降至对数级别,从而应对大规模输入或高频查询。这类技术在实际工程与算法竞赛中均有重要价值。本文以爬楼梯问题为线索,系统讲解递归、记忆化搜索、自底

weixin_31412781的博客 141

力扣70:爬楼梯(动态规划和矩阵快速幂解法)

本文章提出了爬楼梯的两种解法,其中一种是用经典的动态规划思想,另一种则是使用矩阵性质进行解题

weixin_73611714的博客 3276

LeetCode爬楼梯六种解法:从递归到矩阵快速幂全解析

动态规划是算法面试中的核心思想,常以类斐波那契递推形式出现。爬楼梯问题作为经典入门题,通过递归、记忆化搜索、自底向上DP、滚动数组、矩阵快速幂等方案,揭示了重叠子问题与状态转移的本质。这些技术不仅用于解题,还广泛应用于路径计数、资源优化等场景。掌握从O(2^n)到O(logn)的优化路径,能够提升复杂系统的性能设计能力。本文以爬楼梯为例,系统拆解六种实现思路,帮助读者建立算法优化的完整认知。

weixin_32075843的博客 134

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

Java版LeetCode热题100之爬楼梯:从动态规划到矩阵快速幂的全方位解析

要到达第n阶,最后一步要么是从第(n-1)阶走1步上来要么是从第(n-2)阶走2步上来因此,到达第n阶的方法数 = 到达第(n-1)阶的方法数 + 到达第(n-2)阶的方法数问题本质:斐波那契数列的计数问题最优解法空间优化的动态规划,时间O(n),空间O(1)高级优化:矩阵快速幂O(log n),适用于超大规模数学本质:线性递推关系,具有丰富的数学性质适用场景:任何需要计算线性递推序列的问题。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1245

Python实战:解析腾讯视频M3U8加密链接并下载高清影片

本文详细介绍了如何使用Python解析腾讯视频M3U8加密链接并下载高清影片。从环境准备、抓包分析到核心代码实现,逐步讲解如何获取M3U8主链接、解析TS分片列表以及下载合并视频片段。文章还提供了多线程下载、断点续传和加密视频处理等优化方案,帮助开发者高效完成视频下载任务。

weixin_30836759的博客 525

70 爬楼梯 力扣 动态规划 快速幂

使用矩阵乘法,考虑到本题涉及到的变量其实只需要2*2大小的矩阵就可,在n较大时,无论是矩阵的空间开销还是矩阵乘法时间开销相加起来总归比n-1次迭代的时间复杂度要有效率,并且此处可用快速幂,使时间复杂度降到。由低阶的时候不断迭代加进去就可以得到最新的方案值,一直叠加即可,滚动只保持最新的前三个数组的元素即可。实际上不需要将过程中每一阶的方案一一存下来,只需要迭代,滚动数组获得n阶时的具体方案数即可。由上可看到,申请了46个数组空间,若N较大实际上比较费空间。数学思想: 矩阵次幂。适用于n比较大的情况。

weixin_46881809的博客 1234

汽车OTA安全启动:ECU双验签机制与实战排障指南

汽车OTA升级中的安全启动,本质是基于密码学的信任建立过程,其核心在于ECU上电时对固件镜像的可信验证。该机制依托硬件信任根(Secure Boot ROM),通过RSA/ECDSA等非对称算法完成签名验签,确保升级包未被篡改且来源可信。技术价值体现在防止恶意固件注入、支撑功能安全(ASIL)与信息安全(ISO/SAE 21434)合规。典型应用场景包括4S店远程升级、BMS控制器固件更新及多ECU协同启动。实践中,验签名失败往往源于证书链断裂、Flash布局错位或KeyUsage字段不匹配等底层工程细节,

weixin_29314405的博客 77

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8125

leetcode热题100.爬楼梯(从二进制到快速幂)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:示例 2:在上一讲中,我们讲解了递归和动态规划的求解思路,但是我们发现这两种方案的时间复杂度都为 o(n)o(n)o(n),我们试图找一种更加优秀的时间复杂度的解法这里我们就要介绍快速幂的概念了我们先将n表现为2进制,例如3133^{13}313 = 311013^{1101}31101 = 383^838 * 343^434 * 333因为n有 ⌊log2n⌋\lfloor log

qq_51118755的博客 1443

西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告

3、用二极管正向虚拟IV仪测出数据,并记录数据于虚表3和虚表4。1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,表6 二极管三种模型参数测试表(电源电压=1.2V)2、用万用表测出数据,并记录数据于虚表1和虚表2。2、用万用表测出数据,并记录数据于虚表5和虚表6。表5 二极管三种模型参数测试表(电源电压=12V)二极管三种模型参数测试表(电源电压=12V)

Welcome To My6n Blog 4082

从爬楼梯问题剖析C++算法:递归、动态规划与矩阵快速幂

动态规划是解决最优化问题的核心算法思想,其本质是通过将复杂问题分解为重叠子问题,并存储子问题的解来避免重复计算,从而提升效率。这一思想在工程实践中广泛应用于资源分配、路径规划和序列决策等场景。以经典的爬楼梯问题为例,它要求计算到达第n阶楼梯的不同方法数,每次可以爬1或2阶。该问题完美诠释了从暴力递归(O(2^n))到记忆化搜索(O(n)),再到自底向上动态规划(O(n))及其空间优化(滚动数组,O(1))的演进路径。对于超大规模n,还可借助矩阵快速幂将复杂度降至对数级(O(log n))。掌握这些方法,不仅

weixin_30666401的博客 330

三态门Multisim电路仿真——硬件工程师笔记

三态门原理及应用摘要 三态门是具有高电平(1)、低电平(0)和高阻态(Z)三种输出的逻辑电路,通过使能端(EN)控制状态切换。高阻态时输出端等效断路,避免信号冲突。其核心应用包括: 总线系统:多设备共享总线时,仅使能选中设备的三态门,其余保持高阻态,防止干扰。 数据选择器:利用三态门切换多路输入信号,简化电路设计。 实现方式分两种: TTL三态门(三极管构成):低电平使能有效,仿真验证输出逻辑与高阻态。 MOS三态门(MOS管构成):高电平使能有效,仿真显示使能信号控制输出状态。 文中还附硬件工程师笔试面试

XU157303764的博客 2008

机器学习实战4-教育领域:学生成绩的可视化分析与成绩预测-详细分析

大家好,我是微学AI,今天给大家带来机器学习实战4-学生成绩的可视化分析与成绩预测,机器学习在教育中的应用具有很大的潜力,特别是在学生成绩的可视化分析与成绩预测方面。机器学习可以通过对学生的父母教育情况和学校表现等数据进行分析和挖掘,从而揭示潜在的学习模式和趋势。

微学AI的博客 7678

leetcode热题100.爬楼梯(从递归到动态规划)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:示例 2:假设 n=8,我们可以分情况讨论:综上所述,设f(n)为到达第层的方法数,则f(8)=f(7)+f(6)f(8) = f(7) + f(6)f(8)=f(7)+f(6) 我们推广一下得到这样的公式: f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2)f(n)=f(n−1)+f(n−2) 递归的出口为 f(1) = 1,f(0) = 0 我们先用

qq_51118755的博客 1229

SAP ABAP 四种传统的数据库视图类型介绍之二:Projection View

一是该 projection view 只暴露了底层 TADIR 表的四个字段,因此通过该 view 维护数据,在维护界面我们只能维护一条记录的四个字段,如下图所示。使用 Projection view 的优点在于其设计灵活性:如果系统中原始的数据库表字段较多,通过投影仅保留关键信息可有效降低从数据库层到应用层之间的数据传输负担,且保持数据的一致性。其二是笔者之前的文章提到,TADIR 是 ABAP 系统重要的对象注册表,如同 window 操作系统的注册表一样,一般的应用开发人员不应该去修改其内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1441

LeetCode 70 爬楼梯全解:从递归到动态规划与矩阵快速幂

动态规划是算法面试中的核心能力,而LeetCode 70爬楼梯正是理解这一思想的最佳入门题。从暴力递归的指数级重复计算,到记忆化搜索的缓存优化,再到滚动数组将空间压缩至O(1),逐步揭示状态转移的本质。矩阵快速幂更让解法突破O(n)瓶颈,轻松应对超大n的场景。在工程实践中,这类递推模型广泛存在于路径规划、步骤枚举和流程优化中。掌握爬楼梯的递推逻辑,能举一反三解决最小花费爬楼梯等变形题,为后续复杂DP打下坚实基础。

weixin_34116482的博客 312

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

动态规划解爬楼梯问题:从斐波那契到矩阵快速幂

动态规划是解决最优化问题的经典算法范式,其核心思想是通过将问题分解为子问题并存储中间结果来避免重复计算。斐波那契数列作为动态规划的典型案例,完美诠释了递推关系的建立与应用。在工程实践中,动态规划广泛应用于路径规划、支付组合计算等场景。以爬楼梯问题为例,通过分析其与斐波那契数列的等价关系,可以推导出时间复杂度O(n)的标准动态规划解法,以及空间优化版本和O(log n)的矩阵快速幂解法。这些算法思想在LeetCode等编程题库和实际系统设计中都有重要应用价值。

weixin_34199764的博客 49

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

爬楼梯问题六种解法:从递归到动态规划与矩阵快速幂

递归与动态规划是算法面试中绕不开的基础思想,而 LeetCode 爬楼梯问题正是理解两者的经典载体。这道题本质上是一个斐波那契数列变体,最后一步只能从 n-1 或 n-2 阶跨过来,因此递推关系天然成立。从最朴素的递归树开始,重复计算会带来指数级复杂度;引入记忆化后即可降至线性时间,再进一步用滚动数组把空间压缩到常数。当 n 极大时,矩阵快速幂能提供 O(log n) 的解法,通项公式则展示了数学之美,但需注意浮点误差。理解从递归到动态规划再到快速幂的优化链路,不仅能让面试答题更有层次,更有助于解决最小花费

weixin_31421613的博客 277

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Python】使用算法【递归法】【动态规划】【矩阵快速幂】解决爬楼梯问题:假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?

【Python】使用算法【递归法】【动态规划】【矩阵快速幂】解决爬楼梯问题:假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?

m0_63444803的博客 1261
上一篇: 基于非对称纳什谈判的微电网协同优化与Matlab实现
下一篇: 风电智能故障检测:SVM算法在Matlab中的实践
不贪吃
博客等级 码龄10年 47粉丝 1454原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值