第三章作业-动态规划法实践与感悟

1.实践报告-最低通行费

一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。
输入格式:
·第一行是一个整数,表示正方形的宽度N (1≤N<100);
·后面N行,每行N个不大于100的整数,为网格上每个小方格的费用。
输出格式:
至少需要的费用。

1.1递归方程式

最低通行费问题具有最优子结构性质。

设该问题的子问题最优值为dp(i,j),即dp(i,j)是从左上角(0,0)走到(i,j)的最小总费用。

建立dp(i,j)的递归方程如下:
latex-1793117821648

(1)初始化起点,即将(0,0)通行费赋值给dp[0][0].
(2)边界条件,只从左往右走或者只从上往下走。对穿越时间的要求隐含规定了不可走回头路。
(3)(i,j)处的最低通行费由左侧和上侧通行费中的最小值在加上(i,j)本身花费组成。

1.2填表法
(1)维度:n*n
(2)填表范围:i的(1,n];j的(1,n].
(3)填表顺序:根据递推方程可知,i、j数值从小到大得到,所以填表从上到下填,从左到右填。
(4)原问题的最优解是,表中右下角的元素,即dp[n - 1][n - 1]

1.3算法性能
(1)时间复杂度
遍历了一个n*n的网格,时间复杂度与网格格数成正比,所以时间复杂度为O(n^2).
(2)空间复杂度
用到两个二维数组,记录费用的cost,和记录最低通行费的dp.空间复杂度为O(n^2).

2.理解和体会
动态规划法使用时,要明确使用的前提条件,问题是否具备最优子结构性质和重叠子问题性质。解决重叠子问题时,可以使用填表法或者备忘录法。并且,我认为动态规划法最核心和对我来说比较难的点就是状态定义和列出递归方程式。

posted @ 2026-11-02 16:58  张颖菲  阅读(2)  评论(0)    收藏  举报