动态规划实践分析 —— 最低通行费问题求解

动态规划实践报告——以7-4 最低通行费为例
一、用动态规划分析题目“最低通行费”
递归方程式、定义、边界条件:
这个题目的背景是在n行n列的方格路上行走,我们只能向右或者向下走,每个格子都有对应的通行费用,目标是找到从左上角起点走到右下角终点花钱最少的路线。

我们先定义dp[i][j]:表示从起点(1,1)走到第i行第j列这个位置,一共需要的最低通行费。
这道题满足最优子结构的特点:想要走到(i,j)这个位置,只可能是从它正上方(i-1,j)走下来,或者从它左边(i,j-1)走过来。那么走到当前位置的最优方案,一定是这两个位置里面花费更少的那一条路线,再加上当前格子本身的费用。

递归方程式:
dp[i][j] = grid[i][j] + min(dp[i-1][j],dp[i][j-1])

边界条件:

  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. 填表范围:表格里面i和j都从1一直取到n,覆盖整张地图所有位置;
  3. 填表顺序:按照从上到下、一行一行,每行里面从左往右依次填写。
    原因是计算dp[i][j]的时候,必须要先算出它上方、左边格子的值,如果顺序乱了,要用到的数据还没算出来,结果就错了。按这个顺序填表,就能保证计算的时候前置数据已经准备好;
  4. 原问题的最优值:整张表格右下角的dp[n][n],这个值就是从起点走到终点的最低通行费。

一、时间复杂度和空间复杂度分析
时间复杂度:O(n^2)。整张表一共有n乘n个位置,每填一个位置只需要做一次比较和加法,都是很快的常数运算,所以总的运算次数和格子总数成正比。n越大,计算量上涨得越快。

空间复杂度:O(n^2)。基础写法里我们单独开了一张n×n的dp表格,用来存每一个子问题算出来的结果。当然这个题目也可以想办法优化空间,只用一维数组滚动更新,把空间压到O(n),不过我们现在先理解基础二维版本会更容易。

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

  1. 做完这道题之后,我发现动态规划本质上就是把一个大难题拆成很多小一点的子问题。很多子问题会重复用到,如果用普通递归,同一个子问题会反反复复算好多遍,很浪费时间。动态规划就是把每个小问题算好的答案先存进dp表格里,后面再要用的时候直接查表拿结果,不用重新计算,省下很多功夫。
  2. 我感觉动态规划最难的地方其实不是写代码,而是怎么想好dp数组代表什么含义。只要状态定义想清楚了,递推式子、边界条件跟着就比较好推。如果一开始状态想模糊了,后面填表的时候很容易思路混乱。做这道最低通行费的时候,我一开始就混淆了路径和花费,捋清楚dp存的是“走到这里的最小花费”之后,后面的推导顺利了不少。
  3. 动态规划有一套比较固定的思考步骤,和贪心算法不太一样。贪心是每次只选当下看起来最好的选择,没办法回头;但动态规划会同时参考前面多条可行路线的最优结果,再选出当前最好的方案。不过它也不是万能的,前提是题目得满足最优子结构,子问题之间不能乱,不然这套方法就不适用了。
  4. 动态规划是拿空间换时间的思路。我们多开一个数组存放子问题答案,占用更多内存,换来更快的运行速度。这也让我意识到算法不是只有“越快越好”这一个标准,时间和空间之间经常需要取舍。有的题目空间限制很紧,还可以去思考滚动数组这类优化方式,减少内存占用,这也是我之后想要多练习的方向。
  5. 这道题也提醒我,算法分析和敲代码可以分开。最好先在草稿纸上把递推式、填表顺序、边界情况全部理明白,再动手写程序。如果上来直接写代码,很容易漏掉第一行、第一列这种特殊边界,出现莫名其妙的错误。先纸上分析,再写代码调试,整体效率会高很多。
  6. 对比之前写的贪心题目,我能感受到两者适用场景的差别。贪心简单好写,但容易踩坑,局部最优不一定带来全局最优;动态规划考虑得更周全,但前期分析成本更高,需要耐心拆解问题。之后做题的时候,我也会先想一想,这个题目更适合贪心,还是适合动态规划。
posted @ 2026-11-03 23:28  许程程  阅读(4)  评论(0)    收藏  举报