#
# 
# @param obstacleGrid int整型二维数组 
# @return int整型
#
class Solution:
    def uniquePathsWithObstacles(self , obstacleGrid ):
        if not obstacleGrid or obstacleGrid[0][0] == 1 or obstacleGrid[-1][-1] == 1:
            return 0
        m = len(obstacleGrid)  # 行数
        n = len(obstacleGrid[0])  # 列数
        # 创建dp数组,初始化为0
        dp = [[0 for _ in range(n)] for _ in range(m)]
        
        # 起点设置为1
        dp[0][0] = 1
         # 初始化第一行
        for j in range(1, n):
            if obstacleGrid[0][j] == 0:  # 如果没有障碍
                dp[0][j] = dp[0][j-1]  # 只能从左边来
            else:
                dp[0][j] = 0  # 有障碍,路径数为0
          # 初始化第一列
        for i in range(1, m):
            if obstacleGrid[i][0] == 0:  # 如果没有障碍
                dp[i][0] = dp[i-1][0]  # 只能从上边来
            else:
                dp[i][0] = 0  # 有障碍,路径数为0
        
        # 填充dp数组
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:  # 如果有障碍
                    dp[i][j] = 0
                else:  # 如果没有障碍
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]  # 从上边和左边来的路径之和
        
        return dp[m-1][n-1]  # 返回终点的路径数