算法第三章作业
1 递归方程式、定义、边界条件
状态定义
设 dp[i][j]:从左上角(0,0)走到方格(i,j)时,所需要的最小总通行费用。
题目约束:必须在2N-1时间到达,不能走回头路,只能向右、向下移动。
递归方程
dp[i][j]=grid[0][0] i=0;j=0
dp[0][j-1]+grid[0][j] i=0;j>0
dp[i-1][0]+grid[i][0] j=0;i>0
grid[i][j]+\min(dp[i-1][j],dp[i][j-1]) i>0;j>0
边界条件
起点:dp[0][0] = grid[0][0],左上角格子,费用就是自身费用
第 0 行:只能从左边向右走dp[0][j] = dp[0][j-1] + grid[0][j]
第 0 列:只能从上方向下走dp[i][0] = dp[i-1][0] + grid[i][0]
原问题的最优解:dp[N-1][N-1],也就是右下角位置的 dp 值。
如果下标从 1 开始:dp[1][1]=grid[1][1]
第 1 行:dp[1][j]=dp[1][j-1]+grid[1][j]
第 1 列:dp[i][1]=dp[i-1][1]+grid[i][1]
转移:dp[i][j]=grid[i][j]+min(dp[i-1][j],dp[i][j-1])
最优解:dp[N][N]
1.2 填表法说明
填表顺序:按从上到下、从左到右逐行填充。
先填起点 dp[0][0]
先把第 0 行全部填完
再把第 0 列全部填完
依次遍历 i 从 1 到 N-1,每行内 j 从 1 到 N-1\依次计算
1.3 时间复杂度、空间复杂度
时间复杂度:O(N^2)
空间复杂度:O(N)
- 对动态规划算法的理解和体会
动态规划核心是最优子结构、无后效性、重叠子问题三个性质:
最优子结构:一个大问题的最优解,可以由它子问题的最优解推导出来。本题走到 (i,j) 的最优路径,一定来自上方或者左侧格子的最优路径。
无后效性:一旦算出dp[i][j]的最小费用,后续只需要使用这个结果,不再关心这条最优路径是怎么走到 (i,j)的,前面的选择不会被后面的决策影响。
重叠子问题:不同路径会重复求解同一个子问题(比如多个路线都需要求走到(i-1,j)的最小费用),动态规划用填表保存子问题答案,避免暴力递归大量重复计算,把指数级复杂度降到多项式复杂度。

浙公网安备 33010602011771号