作业(7-4)分析
最低通行费实践报告
1.1 最优子结构、递推方程及边界条件
从左上角到右下角,至少需要向右移动 N−1 次、向下移动 N−1 次,共经过 2N−1 个方格,恰好满足时间限制。因此,符合要求的路径只能向右或向下移动。
采用从 0 开始的下标,设 a[i][j] 为第 i 行、第 j 列方格的费用。
定义 dp[i][j] 表示从左上角 (0,0) 到达位置 (i,j) 的最低总费用,包含起点和当前方格的费用。
对于非边界位置 (i,j),只能从上方 (i−1,j) 或左方 (i,j−1) 到达。如果到达前一个位置的子路径不是最优的,就可以用费用更低的子路径替换它,使总费用降低。因此,本题具有最优子结构性质。
递推方程:
dp[i][j] = min(dp[i−1][j], dp[i][j−1]) + a[i][j]
适用范围:1 ≤ i < N,1 ≤ j < N。
边界条件:
- 起点:dp[0][0] = a[0][0]。
- 第一列:dp[i][0] = dp[i−1][0] + a[i][0],其中 1 ≤ i < N。
- 第一行:dp[0][j] = dp[0][j−1] + a[0][j],其中 1 ≤ j < N。
1.2 表的维度、填表范围与填表顺序
使用一个 N×N 的二维数组 dp 保存各位置的最低费用,行、列下标均为 0 到 N−1。
填表顺序:
- 初始化起点 dp[0][0]。
- 从上到下计算第一列。
- 从左到右计算第一行。
- 对其余位置,按行从上到下、每行从左到右计算,即 i 从 1 到 N−1,j 从 1 到 N−1。
计算 dp[i][j] 时,所依赖的上方和左方状态都已经计算完成。
原问题的最优值位于右下角,即 dp[N−1][N−1]。
样例计算完成后的 dp 表如下:
| 行号 / 列号 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | 1 | 5 | 11 | 19 | 29 |
| 1 | 3 | 8 | 15 | 30 | 47 |
| 2 | 9 | 16 | 24 | 42 | 62 |
| 3 | 19 | 27 | 36 | 55 | 76 |
| 4 | 39 | 50 | 61 | 84 | 109 |
因此,最低通行费为 109。
其中一条最优路径经过的方格费用依次为:
1 → 2 → 5 → 7 → 9 → 12 → 19 → 21 → 33
总费用为:
1 + 2 + 5 + 7 + 9 + 12 + 19 + 21 + 33 = 109。
1.3 时间复杂度与空间复杂度
输入和填表均需遍历 N×N 个位置,每个状态只进行常数次比较与加法运算,因此时间复杂度为 O(N²)。
程序使用两个 N×N 的二维数组,分别保存方格费用和动态规划结果,因此空间复杂度为 O(N²)。
浙公网安备 33010602011771号