第三章

递归方程:dp[i][j] = a [i][j] + min ( dp [i-1][j], dp [i][j-1] )
含义:到达 (i,j) 只能从上方 (i-1,j) 向下走,或者从左方 (i,j-1) 向右走,取两条路径里费用更小的一条,再加上当前格子费用 a [i][j]。

边界条件:dp [1][1] = a [1][1] 起点费用就是自身

表维度:二维 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]

时间复杂度:O (n²),空间复杂度:O (n²)

动态规划核心是抓住最优子结构和重叠子问题两个特征,把一个大问题拆解成结构相同、规模更小的子问题。做题时第一步最重要的是设计状态,状态定义不同,转移方程、填表顺序、答案位置都会完全不一样。比如数字三角形是从下往上推,LIS、最低通行费是正向推导;有的题答案在最后一个状态,有的要取全部dp值的最大值。同时要仔细理清转移方向、边界条件,边界常常对应空串、起点、第一行第一列这类不能套用通用转移式的特殊情况。动态规划要思考到这个状态可以从哪些前面的状态转移过来,子问题的最优解能不能拼成全局最优解。填表法是把递归思路落地的方式,用迭代代替递归,规避递归重复计算和栈溢出问题。

posted @ 2026-10-31 12:02  yingovo  阅读(7)  评论(0)    收藏  举报