Lazy loaded image
动态规划1-动态规划简述
Words 331Read Time 1 min
2026-3-1
2026-3-1
type
Post
status
Published
date
Mar 1, 2026
slug
summary
tags
算法笔记
category
笔记
icon
password
📌
动态规划的关键在于找到解决问题的方法,所以如果你能找到问题解决的策略,你就可以解决任何动态规划问题。
  1. 遵循最优性原理
    1. 一个问题可以由一系列的决策来解决,从而获得最优解。
    2. 在解决问题的每个阶段都需要做出决策,这一点可以在解决问题的过程中理解它是如何工作的。
  1. 斐波拉契函数
    1. 斐波拉契函数定义如下:
    2. b.伪代码如下:
      c.设 T(n)为计算 fib(n)所需的基本操作次数。根据代码:
      • n <= 1时,直接返回,这是常数时间,记为 O(1)
      • n > 1时,需要计算 fib(n-1)fib(n-2),再加上一次加法操作。因此,递推关系为:T(n) = T(n-1) + T(n-2) + O(1) ~ 2T(n-1)+ O(1)
      • 由主定理知:时间复杂度属于 级别。
      d.核心结论:斐波那契递归算法效率低下的根源,与 T(n) = 2T(n-1) + 1所揭示的问题本质相同存在大量完全相同的重复子问题计算。
      • 在 fib(5)的递归树中,fib(3)、fib(2)、fib(1)等都被计算了多次。随着 n增大,这种重复是指数级增长的。
🌟
如何改进斐波拉契函数?—— 从指数到线性的飞跃
理解了递归树和重复计算的问题,改进方案就非常直观了:
  1. 记忆化(自顶向下的动态规划):用一个缓存(数组或字典)存储已经计算过的 fib(k)的结果。当需要再次计算时,直接从缓存中读取,避免重复的递归调用。这样每个 fib(k)只计算一次,时间复杂度降至 O(n)
  1. 动态规划(自底向上迭代):直接从 fib(0)fib(1)开始,循环计算fib(n)。这是最高效的方法,时间复杂度 O(n),空间复杂度可以优化到 O(1)只存储前两个值,大多数动态规划问题可以配合制表法分析)。——代码如何写?
    1. 代码
 
上一篇
算法设计与分析-习题5.4
下一篇
从 Heo 到 Heo Pro