7-4 最低通行费
7-4 最低通行费 动态规划分析
1.1 递归方程式
关键点:从(1,1)到(N,N)至少经过2N-1个格子,题目要求恰好2N-1时间,故只能向右或向下走。
设dp[i][j]为从(1,1)到(i,j)的最小费用:
- 边界:dp[1][1]=cost[1][1]
- 第一行:dp[1][j]=dp[1][j-1]+cost[1][j]
- 第一列:dp[i][1]=dp[i-1][1]+cost[i][1]
- 其余:dp[i][j]=cost[i][j]+min(dp[i-1][j],dp[i][j-1])
最优子结构说明:到达(i,j)的最后一步只能来自上方或左方,故dp[i][j]只依赖两个前驱状态的最优值,满足最优子结构。
1.2 填表法
- 维度:二维表dp[1...N][1...N],与网格同规模。
- 范围:i从1到N,j从1到N。
- 顺序:先填dp[1][1],再填第一行(j递增)、第一列(i递增),然后i从2到N、j从2到N按行优先填写。这样保证dp[i-1][j]、dp[i][j-1]已计算。
- 最优值:dp[N][N],即表格右下角元素。
1.3 复杂度
- 时间:O(N2),共N2个状态,每个状态O(1)转移。
- 空间:O(N^2);用滚动数组只保留上一行和当前行,可优化到O(N)。
对动态规划算法的理解和体会
动态规划的核心是把大问题拆成小问题并保存子问题的解,避免重复计算。它适用于同时具备最优子结构和重叠子问题的问题。
通过"最低通行费"这道题,我体会到求解DP的一般步骤:先分析约束简化问题(本题"恰好2N-1时间"把四方向移动压缩为只能向右或向下),再定义状态dp[i][j],然后由"最后一步从哪来"推出转移方程,接着确定边界和填表顺序,最后定答案位置并分析复杂度。
几点体会:一是状态定义决定一切,定义得好转移方程水到渠成;二是约束条件往往是解题钥匙,本题的时间限制反而是简化的突破口;三是填表顺序体现依赖关系,滚动数组优化正是在理清依赖后把空间从O(N^2)降到O(N),说明优化建立在对结构的理解上;四是DP是用空间换时间的典型,把指数级搜索压缩为多项式时间。
总之,DP不是背模板,而是"分解问题、刻画状态、利用已有结果"的思维方式。遇到新问题我会先问:子问题是什么?如何依赖?能否有序地填表算出来?想清这三点,思路就清晰了。

浙公网安备 33010602011771号