应用题-动态规划-不同路径II
```python
class Solution:
# 给定一个 m x n 的整数数组 grid。
# 一个机器人初始位于 左上角(即 grid[0][0])。
# 机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。
# 机器人每次只能向下或者向右移动一步。
# 网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
# 返回机器人能够到达右下角的不同路径数量。
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len( obstacleGrid )
n = len( obstacleGrid[ 0 ] )
# 确定dp含义 ( 即记录什么 )
dp = [ [ 0 for _ in range( n ) ] for _ in range( m ) ]
# 递推公式: 不是障碍格的grid( i-1,j )和grid( i, j-1 ) ) 走一格就是 grid( i, j )
# 初始化dp
for i in range( n ):
if obstacleGrid[ 0 ][ i ] == 1:
# 障碍物堵住 后续位置均不可达
break
dp[ 0 ][ i ] = 1
for i in range( m ):
if obstacleGrid[ i ][ 0 ] == 1: break
dp[ i ][ 0 ] = 1
# 实现递推
for i in range( 1, m ):
for j in range( 1, n ):
# 位置本身就是障碍格
if obstacleGrid[ i ][ j ] == 1: dp[ i ][ j ] = 0
else:
# 否则才可到达
if obstacleGrid[ i - 1 ][ j ] == 0: dp[ i ][ j ] += dp[ i - 1 ][ j ]
if obstacleGrid[ i ][ j - 1 ] == 0: dp[ i ][ j ] += dp[ i ][ j - 1 ]
return dp[ - 1 ][ -1 ]
```