62. 不同路径
1. 确定dp数组及下标含义
dp[i][j] 的定义:到达(i,j) 的不同方法总数
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20...
2. 递推公式:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
从【上一个点】到dp[i][j]有且只有两种方法:
dp[i-1][j] + 往下走
dp[i][j-1] + 往右走
所以dp[i][j]的所有可能性就是这两者之和!类似爬楼梯
注意:二维dp数组很可能与相邻的位置产生关系
3. dp数组如何初始化:
初始化的内容:带入一个最小可能i和j到递推公式里(i=1,j=1),看此时需要“已知”(即不能从别的地方推出来)的值是什么(dp[0][1] & dp[1][0])。注意此时只要dp[x][y]的x和y任意一个是0,都需要初始化,因为不能从别的地方推出来
4. 遍历顺序:从前向后
注意遍历从【初始化后】的点开始!
如果初始化了i=0,j=1,就从i=1, j=1开始
⚠️:如何初始化二维数组:dp = [[0] * n for _ in range(m)]
n 为列数,m为行数
注意写代码的顺序是:先初始化,然后递推公式
63. 不同路径II
和上一题的区别:有obstacle
把到达障碍格的dp[i][j]标为0即可
⚠️:注意特殊情况:
1. 障碍在起点或终点时:直接返回0
2. 障碍在左边界或上边界的任意一点:则这一点【及之后】的该边界的dp值均为0(因为边界只能这个方向走,且绕不过这个点)
方法:在初始化时找到这个点后,break即可,因为最最开始初始化二维数组的时候值都为0