第三章作业

1.1 递归方程式、定义、边界条件
(1)状态定义
dp[i][j]:从起点 (1,1) 走到网格位置 (i,j) 所需要的最小总费用。
grid[i][j]:网格 (i,j) 位置本身的费用。

(2)最优子结构分析要到达 (i,j),因为只能向右、向下走,前一步只有两种可能:
从上方 (i-1,j) 向下走到 (i,j)
从左方 (i,j-1) 向右走到 (i,j)
取两者最小值,再加上当前格子本身费用,得到递归方程:
dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])

(3)边界条件
1.起点:dp[1][1] = grid[1][1],起点就是自身费用。
2.第一行(i=1,j>1):上面没有格子,只能从左边一路向右走
dp[1][j] = dp[1][j-1] + grid[1][j]
3. 第一列(j=1,i>1):左边没有格子,只能从上一路向下走
dp[i][1] = dp[i-1][1] + grid[i][1]

1.2 填表法:表维度、填表范围、填表顺序、原问题最优值
(1)表的维度二维 DP 表,大小 N * N,和网格一致。

(2)填表范围
先填边界:第 1 行全部、第 1 列全部
再填内部区域:2 <= i <= N,2 <= j <= N

(3)填表顺序从上到下、逐行填写;每行内部从左往右依次填写
原因:计算 dp[i][j] 需要的 dp[i-1][j](上一行,已经算好)、dp[i][j-1](本行左边,刚刚算好)。保证计算当前格子时,依赖的子问题结果已经存在。

(4)原问题最优值原问题要求从左上角到右下角的最小费用,答案就是: dp[N][N]

1.3 时间复杂度、空间复杂度分析
1.时间复杂度
DP 表一共 N^2 个单元格,每个单元格只做一次取最小值和加法运算,是常数 O(1) 操作。
T(N)=O(N^2)

2.空间复杂度
方案 1:直接开 N * N 的 dp 二维数组
空间复杂度:S(N) = O(N^2)

(二)对动态规划算法的理解和体会
1.动态规划的核心思想是分治 + 记忆化,避免重复计算,适合具有最优子结构和无后效性的最优化问题。
2.动态规划不是暴力枚举所有路径,暴力枚举路径是指数级复杂度;DP 把大问题拆解成规模更小的子问题,把子问题最优解保存下来(填表),每个子问题只计算一次,大幅降低时间开销。
3.设计 DP 最重要两步:定义状态、推导状态转移方程。状态定义好坏直接决定方程好不好写;要判断清楚子问题之间的依赖关系,设计合法的填表顺序,保证先算子问题,再算父问题。
4。最优子结构是前提:一个问题的最优解包含其子问题的最优解;无后效性保证:当前状态一旦确定,后续决策不受更早状态的影响。不满足这两个性质的问题不能直接用 DP。
5.DP 有两种实现思路:递归记忆化搜索(自顶向下)、填表迭代法(自底向上)。填表法迭代一般效率更高、不容易栈溢出,本题就是典型自底向上填表。
6.DP 也要注意空间权衡:很多二维 DP 都可以滚动数组压缩空间,牺牲可读性换取更低内存占用。

posted @ 2026-11-03 20:53  行了吧  阅读(5)  评论(0)    收藏  举报