算法第三章作业
一、实践报告
1.1
1.最优子结构:从(i,j)到(N,N)的最优路径,由从(i,j)向右走到(i,j+1)后的最优路径或从(i,j)向下走到(i+1,j)后的最优路径”之一构成。
2.递归方程式:
dp[i][j] = a[i][j] + min(dp[i+1][j], dp[i][j+1])
3.定义:
dp[i][j] = 从 (i,j) 出发,走到右下角 (N,N) 的最小总费用;
a[i][j]:当前格子的费用;
dp[i+1][j]:从下方格子出发到终点的最小费用;
dp[i][j+1]:从右方格子出发到终点的最小费用;
4.边界条件
1)终点:dp[N][N] = a[N][N]
2)最后一行 i = N:
dp[N][j] = a[N][j] + dp[N][j+1]
3)最后一列 j = N:
dp[i][N] = a[i][N] + dp[i+1][N]
1.2
1.填表法中表的维度:(N + 1) × (N + 1),下标从 1 到 N,第 0 行和第 0 列不使用
2.填表范围:
i :1 <= i <= N
j :1 <= j <= N
3.填表顺序:
整体是从右下到左上,即自下而上,自右向左
先填终点 (N,N)
再填最后一行:j 从 N-1 递减到 1
再填最后一列:i 从 N-1 递减到 1
最后填内部:i 从 N-1 递减到 1,j 从 N-1 递减到 1
4.原问题的最优值是 dp[1][1]
1.3
1.时间复杂度 = O(N²):一共有NN 个状态,每个状态只做一次min比较、一次加法,单层双重循环。
2.空间复杂度 = O(N²):本题我开了两个二维数组a和dp,都是((N+1)(N+1)规格,O(N²) + O(N²) = O(N²)
二、对动态规划算法的理解和体会:
动态规划的核心是拆分、复用子问题,它适合有最优子结构、重叠子问题的问题。动态规划把已经算出来的子问题结果保存在 dp 表里,每个子问题只算一次,用空间换时间。
做题核心是写出状态转移方程,找到边界判断填表顺序,保证算当前状态时,它依赖的子问题已经计算完成。
浙公网安备 33010602011771号