动态规划(6.不同路径II)
题目链接:63. 不同路径 II - 力扣(LeetCode)
解法:
本题为不同路径的变型,只不过有些地方有「障碍物」,只要在「状态转移」上稍加修改就可解决。
- 状态表示:
对于这种Γ路径类」的问题,我们的状态表⽰⼀般有两种形式:
- 从 [i, j] 位置出发,巴拉巴拉;
- 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表示的方式:
dp[i][j]
表示:⾛到
[i, j]
位置处,⼀共有多少种方式。
- 状态转移:

前的⼀小步,有两种情况:
- 从 [i, j] 位置的上⽅( [i - 1, j] 的位置)向下走一步,转移到 [i, j] 位置;
- 从 [i, j] 位置的左⽅( [i, j - 1] 的位置)向右走一步,转移到 [i, j] 位置。
但是,
[i - 1, j]
与
[i, j - 1]
位置都是可能有障碍的,此时从上面或者左边是不可能到达 [i, j]
位置的,也就是说,此时的⽅法数应该是 0。
由此我们可以得出⼀个结论,只要这个位置上Γ有障碍物」,那么我们就不需要计算这个位置上的值,直接让它等于 0
即可。
- 初始化:

- 辅助结点⾥⾯的值要Γ保证后续填表是正确的」;
- Γ下标的映射关系」。
在本题中,添加一行,并且添加⼀列后,只需将
dp[1][0]
的位置初始化为
1
即可。
- 填表顺序:
根据Γ状态转移」的推导,填表的顺序就是Γ从上往下」填每⼀⾏,每⼀⾏Γ从左往右」。
- 返回值:
根据Γ状态表示」,我们要返回的结果是
dp[m][n]
。
代码:
C++:
java: