首页/新闻资讯/正文详情

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

发布时间:2026/11/9 16:11:50 来源:云帆数科 栏目:资讯中心
动态规划解爬楼梯问题:从斐波那契到矩阵快速幂
1. 爬楼梯问题的数学本质爬楼梯问题是一个经典的动态规划入门题目表面上看似简单实则蕴含着深刻的数学原理。假设你正在爬一个有n个台阶的楼梯每次可以跨1个或2个台阶问有多少种不同的方法可以爬到楼顶。这个问题实际上等价于斐波那契数列问题。让我们从数学角度分析当n1时只有1种方法一步登顶n2时有2种方法11或直接跨2步n3时有3种方法1111221。可以看到这正是斐波那契数列的递推关系f(n) f(n-1) f(n-2)。关键理解每个台阶的到达方式要么是从前一个台阶跨1步上来要么是从前两个台阶跨2步上来。这就是递推关系的核心逻辑。2. 递归解法及其局限性最直观的解法是使用递归def climbStairs(n): if n 1: return 1 if n 2: return 2 return climbStairs(n-1) climbStairs(n-2)但这种朴素递归存在严重效率问题。以计算climbStairs(5)为例需要计算climbStairs(4)和climbStairs(3)clibStairs(4)又需要计算climbStairs(3)和climbStairs(2)可以看到climbStairs(3)被重复计算了时间复杂度达到O(2^n)当n较大时完全不可行。这就是递归解法在实际应用中最大的痛点。3. 动态规划的标准解法动态规划是解决这类问题的标准方法。我们可以使用两种实现方式3.1 自底向上的迭代法def climbStairs(n): if n 1: return 1 dp [0]*(n1) dp[1] 1 dp[2] 2 for i in range(3, n1): dp[i] dp[i-1] dp[i-2] return dp[n]这种方法创建了一个dp数组存储中间结果初始化基础情况n1和n2通过循环逐步构建更大问题的解时间复杂度O(n)空间复杂度O(n)3.2 空间优化版本观察到每个状态只依赖前两个状态可以进一步优化空间def climbStairs(n): if n 1: return 1 first, second 1, 2 for _ in range(3, n1): first, second second, first second return second这样空间复杂度降为O(1)只使用常数空间是面试中最推荐的写法。4. 矩阵快速幂解法对于追求极致效率的场景我们可以使用矩阵快速幂将时间复杂度降到O(log n)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] * 2 result[0][1] * 1这种方法基于斐波那契数列的矩阵表示形式通过快速幂算法大幅提升计算效率特别适合n非常大的情况比如n10^6。5. 通用化问题扩展实际问题中楼梯问题的变种非常多常见的有5.1 可变步长版本如果每次可以跨1、2或3个台阶解法只需修改递推关系def climbStairs(n): if n 1: return 1 if n 2: return 2 if n 3: return 4 dp [0]*(n1) dp[1], dp[2], dp[3] 1, 2, 4 for i in range(4, n1): dp[i] dp[i-1] dp[i-2] dp[i-3] return dp[n]5.2 带障碍物版本LeetCode 63题就是在网格中加入障碍物def uniquePathsWithObstacles(grid): m, n len(grid), len(grid[0]) dp [[0]*n for _ in range(m)] dp[0][0] 1 if grid[0][0] 0 else 0 for i in range(1, m): dp[i][0] dp[i-1][0] if grid[i][0] 0 else 0 for j in range(1, n): dp[0][j] dp[0][j-1] if grid[0][j] 0 else 0 for i in range(1, m): for j in range(1, n): if grid[i][j] 1: dp[i][j] 0 else: dp[i][j] dp[i-1][j] dp[i][j-1] return dp[-1][-1]5.3 最小代价爬楼梯LeetCode 746题要求计算最小花费def minCostClimbingStairs(cost): n len(cost) dp [0]*(n1) for i in range(2, n1): dp[i] min(dp[i-1]cost[i-1], dp[i-2]cost[i-2]) return dp[n]6. 实际工程中的应用场景爬楼梯问题看似简单但其解法模式在工程中有广泛应用支付系统计算组合支付方式如用不同面额硬币支付一定金额文本处理计算字符串解码方式的数量如A1B2...Z26游戏设计角色移动路径计算金融分析计算投资组合的可能配置方式以字符串解码为例的代码实现def numDecodings(s): if not s: return 0 n len(s) dp [0]*(n1) dp[0] 1 dp[1] 0 if s[0] 0 else 1 for i in range(2, n1): if s[i-1] ! 0: dp[i] dp[i-1] two_digit int(s[i-2:i]) if 10 two_digit 26: dp[i] dp[i-2] return dp[n]7. 算法选择与性能对比不同解法在不同场景下的表现方法时间复杂度空间复杂度适用场景朴素递归O(2^n)O(n)仅适用于教学演示记忆化递归O(n)O(n)递归思路清晰但需优化动态规划O(n)O(n)标准解法易于理解空间优化DPO(n)O(1)面试最佳实践矩阵快速幂O(log n)O(1)n极大时的最优解在实际编程面试中推荐使用空间优化的动态规划解法它兼具了代码简洁性和高效性。对于特别大的n如n10^6矩阵快速幂是唯一可行的方案。8. 常见错误与调试技巧新手在解决这类问题时容易犯的错误边界条件处理不当忘记处理n0或n1的特殊情况索引越界dp数组大小设置错误递推关系错误混淆f(n-1)和f(n-2)的顺序整数溢出当n很大时结果可能超出整数范围调试建议先用小例子手工计算验证打印dp数组中间值检查是否正确添加详细的注释说明每个步骤的意图例如这是一个带有调试输出的实现def climbStairs(n): if n 1: return 1 dp [0]*(n1) dp[1] 1 dp[2] 2 print(f初始化dp[1]{dp[1]}, dp[2]{dp[2]}) for i in range(3, n1): dp[i] dp[i-1] dp[i-2] print(f计算dp[{i}]: {dp[i-1]} {dp[i-2]} {dp[i]}) return dp[n]9. 数学通项公式解法斐波那契数列其实有通项公式Binet公式f(n) (φ^n - ψ^n)/√5其中φ(1√5)/2≈1.618ψ(1-√5)/2≈-0.618Python实现def climbStairs(n): sqrt5 5**0.5 phi (1 sqrt5) / 2 psi (1 - sqrt5) / 2 return int((phi**(n1) - psi**(n1)) / sqrt5)注意由于浮点数精度问题当n较大时结果可能不准确在实际编程比赛中通常会要求对结果取模来避免大数问题10. 不同语言实现对比最后我们看看在不同编程语言中的实现差异Java实现public int climbStairs(int n) { if (n 1) return 1; int[] dp new int[n1]; dp[1] 1; dp[2] 2; for (int i 3; i n; i) { dp[i] dp[i-1] dp[i-2]; } return dp[n]; }C实现int climbStairs(int n) { if (n 1) return 1; vectorint dp(n1); dp[1] 1; dp[2] 2; for (int i 3; i n; i) { dp[i] dp[i-1] dp[i-2]; } return dp[n]; }JavaScript实现function climbStairs(n) { if (n 1) return 1; let dp new Array(n1); dp[1] 1; dp[2] 2; for (let i 3; i n; i) { dp[i] dp[i-1] dp[i-2]; } return dp[n]; }Go实现func climbStairs(n int) int { if n 1 { return 1 } dp : make([]int, n1) dp[1] 1 dp[2] 2 for i : 3; i n; i { dp[i] dp[i-1] dp[i-2] } return dp[n] }从这些实现可以看出虽然语法不同但核心算法逻辑是完全一致的。这也体现了动态规划作为一种算法范式的通用性。

相关推荐

马尾毛手工实验:从原料处理到八股编手绳全记录
马尾毛手工实验:从原料处理到八股编手绳全记录

很多人第一次看到"ponytail"这个项目名,都会以为是发型教程。其实我做的是一个围绕"马尾毛"本身的手工实验——从马场捡回来的那根马尾,经过清洗、软化、编结,最终变成绒球挂件、流苏饰品和一条能天天戴在手上的八股编马… · 2026/11/9 16:11:50

Unity游戏开发中的GC优化与内存管理实战
Unity游戏开发中的GC优化与内存管理实战

1. GC在Unity中的核心作用与工作原理 在Unity开发中,GC(Garbage Collection)是托管堆内存管理的核心机制。当你的C#脚本创建新对象时,这些对象会被分配在托管堆上。而GC的工作就是自动回收那些不再被引用的对象所占用的内存空间。… · 2026/11/9 16:11:50

SSM+Vue高校就业系统源码:毕业设计可直接部署的全栈项目
SSM+Vue高校就业系统源码:毕业设计可直接部署的全栈项目

简介:本资源是一套完整的高校就业管理系统毕业设计项目源码,面向计算机专业本科生及Java初学者,解决高校就业信息管理数字化、流程线上化的实际需求。系统采用B/S架构,后端基于SSM(SpringSpringMVCMyBatisPlus&#xf… · 2026/11/4 16:18:02

苏州复审电工证在哪里 找到真实经历的解决方案
苏州复审电工证在哪里 找到真实经历的解决方案

苏州复审电工证在哪里 找到真实经历的解决方案 之前考的证在外省能不能转过来?这个问题我问过不下十次,身边的朋友也都在问。很多人在外地考了电工证,回到苏州想复审,却发现流程复杂、信息不对称,甚至有朋友因为操作不当,证被注销了。今天我就结合… · 2026/11/9 16:11:12

高州市怎么考电工证多久拿证,实操考试心里没底怕挂科
高州市怎么考电工证多久拿证,实操考试心里没底怕挂科

高州市怎么考电工证多久拿证,实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。很多在高州市想考电工证的小伙伴,最担心的就是考试环节,尤其是实操部分,生怕因为一点小失误就挂科,耽误拿证时间。其实,只要你提前准备、掌握技巧,… · 2026/11/9 16:11:12

你学历不高怕报不上名?常州电工作业管理办法告诉你这个上岗必备证书怎么拿
你学历不高怕报不上名?常州电工作业管理办法告诉你这个上岗必备证书怎么拿

你学历不高怕报不上名?常州电工作业管理办法告诉你这个上岗必备证书怎么拿 你学历不高怕报不上名?常州电工作业管理办法告诉你这个上岗必备证书怎么拿。很多人一听到要考证,脑袋里第一个念头就是“我学历不够,肯定报不了”。其实,你大可不必这么想,电工… · 2026/11/9 16:11:12

不同等级电工证考什么值不值得考 这些细节决定你能否顺利上岗
不同等级电工证考什么值不值得考 这些细节决定你能否顺利上岗

不同等级电工证考什么值不值得考 这些细节决定你能否顺利上岗 你是不是也在为找电工相关的工作发愁?别急,特种作业操作证,尤其是电工证,是很多电工类岗位的“入场券”。 不同等级电工证考什么… · 2026/11/9 16:11:12

平度市安监局电工证怎么考?2026河南最新政策全解析
平度市安监局电工证怎么考?2026河南最新政策全解析

平度市安监局电工证怎么考?2026河南最新政策全解析 证书过期了不知道怎么复审延期,这是很多特种作业人员的实际困境。特别是像平度市安监局电工证这样的证件,一旦过期,不仅影响工作,还可能带来安全隐患。2026年河南最新政策对特种作业人员的复审… · 2026/11/9 16:11:12

电工证办理直播卖证值不值得考?实操考试心里没底怕挂科怎么办
电工证办理直播卖证值不值得考?实操考试心里没底怕挂科怎么办

电工证办理直播卖证值不值得考?实操考试心里没底怕挂科怎么办 实操考试心里没底怕挂科?你不是一个人,很多人在报考电工证的时候,都会担心自己能不能通过实操考试。尤其是现在网上“电工证办理直播卖证”的信息越来越多,很多人开始怀疑,… · 2026/11/9 16:10:11

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/9 2:05:04

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/9 3:11:26

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/9 5:24:17

电工证不需要考复审延期怎么办理 通过率揭秘
电工证不需要考复审延期怎么办理 通过率揭秘

电工证不需要考复审延期怎么办理 通过率揭秘 不知道去哪报名怕被中介坑?电工证不需要考复审延期怎么办理?最近不少学员都在问这个问题,尤其是刚拿到证的新手,对复审流程一知半解,生怕被培训机构套路。别担心,今天咱们就来聊聊电工证复审的真相,尤其是… · 2026/11/9 0:00:54

砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南
砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南

砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的共同心声。尤其是像电工这样的特种作业,操作证不仅关系到能不能上工,还直接关系到工资高低和职业发展。可偏偏,很多人连怎么报名、去哪… · 2026/11/9 0:00:54

南方电网电工作业含金量高吗?应届生怎么考怎么干?
南方电网电工作业含金量高吗?应届生怎么考怎么干?

南方电网电工作业含金量高吗?应届生怎么考怎么干? 工地太忙根本没时间复习考试,这不是个别现象,而是很多刚毕业的工程类学生面临的现实。南方电网电工作业的证书,听起来门槛不低,但 含金量… · 2026/11/9 0:00:54

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:35

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:58

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:25:08

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码