第三章

  1. 动态规划法求解步骤分析

1.1 递归方程式、定义及边界条件

· 状态定义:设 dp[i][j] 表示从网格左上角 (1,1) 走到坐标为 (i,j) 的方格时,所需要的最低通行费用。设 cost[i][j] 为题目输入的方格 (i,j) 本身的通行费。
· 最优子结构性质及递归方程式:
要到达格子 (i,j),商人只能从它的上方 (i-1, j) 向下走一步,或者从它的左侧 (i, j-1) 向右走一步。为了使到达 (i,j) 的总费用最低,需要选择这两条路径中费用较小的那一条,再加上当前格子 (i,j) 的过路费。
因此,递归方程式为:

dp[i][j] = cost[i][j] + \min(dp[i-1][j], dp[i][j-1])
]

· 边界条件:
· 起点:dp[1][1] = cost[1][1]。
· 第一行(只能从左边走过来):dp[1][j] = dp[1][j-1] + cost[1][j] (j > 1)。
· 第一列(只能从上边走下来):dp[i][1] = dp[i-1][1] + cost[i][1] (i > 1)。

1.2 填表法分析

· 表的维度:二维表。使用一个 N \times N 的二维数组 dp。
· 填表范围:行索引 i 从 1 到 N,列索引 j 从 1 到 N。
· 填表顺序:从上到下,从左到右。因为计算 dp[i][j] 依赖于其上方 dp[i-1][j] 和左侧 dp[i][j-1] 的值,所以必须保证在计算当前格子时,其上方和左侧的格子已经计算完毕。
· 原问题的最优值:最终商人从右下角出网格,所以原问题的最优值是表格右下角的元素,即 dp[N][N]。

1.3 算法的时间和空间复杂度

· 时间复杂度:O(N^2)。算法需要遍历整个 N \times N 的网格,每个格子的状态转移(求最小值并相加)只需常数时间 O(1)。所以总时间复杂度为网格的格子总数。
· 空间复杂度:O(N^2)。需要额外的二维数组来存储每个格子的状态值。(注:如果使用一维数组进行滚动优化,空间复杂度可降至 O(N),但常规填表法为 O(N^2))。


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

动态规划是一种通过“将原问题分解为相似的子问题,并存储子问题的解来避免重复计算”的算法思想。结合本题,我的理解和体会如下:

  1. 核心在于“状态定义”与“状态转移”:DP 最难的部分是定义状态(如本题用 dp[i][j] 表示走到某点的最小花费)和找到状态转换关系。只要推导出正确的状态转移方程,问题就迎刃而解了。
  2. 最优子结构与无后效性:问题的最优解必须包含子问题的最优解(走到终点的最短路,必定由走到其上方或左侧点的最短路延伸而来);且当前状态一旦确定,就不受后续决策影响,商人走到 (i,j) 后,前面的路径已经不再重要。
  3. 空间换时间的典型代表:通过填表法记录结果,将原本可能需要指数级穷举的路径搜索问题(如DFS),降维成了多项式级复杂度(O(N^2))。
  4. 实际应用广泛:动态规划在路径规划、资源分配、股票买卖以及生物信息学(如序列比对)等领域有极其广泛的应用,是计算机科学中非常重要的算法设计范式。
posted @ 2026-11-03 21:45  曹烨晴  阅读(4)  评论(0)    收藏  举报