第三章作业
1.1
最优子结构性质:
设dp[i][j] 表示从左上角 (1,1) 走到网格中第 i 行第 j 列的小方格时,所需要花费的最低通行费。原问题的最优解即为 dp[N][N]。
由于商人只能向右或向下移动到达 (i, j),因此到达 (i, j) 只能来自它的上方 (i-1, j) 或左方 (i, j-1)。为了使得总费用最低,我们需要选择这两条路径中费用较小的那一个,再加上当前方格 (i, j) 本身的费用。
递归方程式:
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + a[i][j]
(其中a[i][j] 为第 i 行第 j 列方格的通行费,且 i>1, j>1)
边界条件:
起点: 左上角,dp[1][1]= a[1][1]
第一行(只能从左向右走): 对于j > 1,dp[1][j] = dp[1][j-1] + a[1][j]
第一列(只能从上向下走): 对于i > 1,dp[i][1] = dp[i-1][1] + a[i][1]
1.2
表的维度: 记录所需要花费的最低通行费的二维数组dp[105][105],同时需要读取并存储输入的网格费用矩阵 a[105][105]
填表范围: 外层循环 i 从 1 到 N,内层循环 j 从 1 到 N。
填表顺序: 从上到下,从左到右。因为计算 dp[i][j] 时,必须保证其依赖的 dp[i-1][j](上一行和 dp[i][j-1](左边一列)已经被计算出来。
原问题的最优值: 表格右下角元素 dp[N][N]
1.3
时间复杂度:O(N^2)。算法需要两层嵌套的for循环遍历整个N×N 的网格,对于每个格子进行比较大小、加法运算。
空间复杂度:O(N^2)。算法需要两个N×N 的二维数组:一个用于存储原始网格的费用a,另一个用于存储动态规划的状态dp。
浙公网安备 33010602011771号