作业(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。

填表顺序:

  1. 初始化起点 dp[0][0]。
  2. 从上到下计算第一列。
  3. 从左到右计算第一行。
  4. 对其余位置,按行从上到下、每行从左到右计算,即 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²)。

posted @ 2026-10-28 17:19  steve0v0  阅读(4)  评论(0)    收藏  举报