算法第3章作业

1.1 根据最优子结构性质,列出递归方程式,说明方程式的定义、边界条件

状态定义:dp [i][j] 表示走到格子 (i,j) 时的最小总费用;a [i][j] 表示格子 (i,j) 本身的费用。
到达 (i,j) 合法来源只有两个:上方 (i-1,j),从上往下走;左方 (i,j-1),从左往右走。
递归方程:dp [i][j] = a [i][j] + min (dp [i-1][j], dp [i][j-1])
边界条件:

  1. 起点:dp [1][1] = a [1][1]
  2. 第一行(i=1,j>1):不能从上面来,只能从左边依次向右走,dp [1][j] = dp [1][j-1] + a [1][j]
  3. 第一列(j=1,i>1):不能从左边来,只能从上往下走,dp [i][1] = dp [i-1][1] + a [i][1]

最优子结构说明:到达 (i,j) 的最优路径,它到达前驱点 (i-1,j) 或者 (i,j-1) 的那段路径一定也是最优路径。如果前驱存在费用更低的走法,替换之后整体费用会更低,和最优的前提矛盾。因此原问题最优解包含子问题最优解,满足最优子结构。

1.2 给出填表法中表的维度、填表范围和填表顺序。以及原问题的最优值是哪个表格元素

表维度:二维 dp [N][N],代码一般开 dp [N+1][N+1],下标从 1 开始使用。
填表范围:i 从 1 到 N,j 从 1 到 N。
填表顺序:从上到下遍历每一行,同一行内部从左向右填写。理由:计算 dp [i][j] 依赖上方 dp [i-1][j](上一行,已经计算完成)和左边 dp [i][j-1](同行左侧,已经计算完成)。
原问题最优值:dp [N][N]

1.3 分析该算法的时间和空间复杂度

时间复杂度:O (N²)。网格一共 N² 个状态,每个状态仅做一次取最小值和加法运算,属于常数操作。
空间复杂度:O (N²)。需要开辟二维 dp 数组保存所有状态;也可以原地复用原费用数组,把额外空间优化到 O (1),基础分析写 O (N²) 即可。

我对动态规划算法的理解和体会

动态规划的核心是抓住最优子结构与重叠子问题两个性质,把一个规模较大的问题拆解成一系列结构相同、规模更小的子问题,并且保存子问题的计算结果,避免重复计算,以此提升效率。
在这道最低通行费题目中,题目给出的时间限制看似是移动约束,本质上筛掉了所有绕路方案,让可行路径只剩下向右和向下两种走法,从而满足最优子结构:到达每个格子的最小费用,只依赖上方和左方格子的最优解。
设计 DP 时,第一步最重要的是合理定义状态;状态定义好了,递归方程、边界条件才能够顺利推导。同时填表顺序必须遵守依赖关系,保证计算当前状态时,它所需要的子问题已经求解完成。
对比贪心算法,贪心每次只选择局部最优,不一定得到全局最优;动态规划会遍历所有合法子问题组合,一定可以求出全局最优解,代价是需要额外空间存储状态。和分治相比,分治的子问题相互独立,而动态规划大量子问题会重复访问,缓存结果才有意义。很多 DP 题目还可以通过滚动数组等方式压缩空间,进一步优化内存开销。

posted @ 2026-10-29 20:30  breathing1234  阅读(6)  评论(0)    收藏  举报