[Leetcode 63] Dynamic Programming - Unique Paths II(不同路径 II)

这个题应该考虑从终点开始,和前一个问题的不同在于要把不能通过的障碍考虑进去。

在障碍位置的可走路径数应该为0

d p [ i ] [ j ] dp[i][j] dp[i][j]表示从坐标 ( i , j ) (i,j) (i,j)到终点的可走路径数

从终点开始往回填表,遇到障碍则障碍位置的可走路径数就是0。如果当前位置不是障碍,则当前位置 ( i , j ) (i,j) (i,j)的可走路径数为:
d p [ i ] [ j ] = d p [ i + 1 ] [ j ] + d p [ i ] [ j + 1 ] dp[i][j] = dp[i+1][j] + dp[i][j+1] dp[i][j]=dp[i+1][j]+dp[i][j+1]
这里需要注意防止越界,因为 i + 1 i+1 i+1 j + 1 j+1 j+1的值可能会大于当前二维表的维度,如果大于的话则说明往右或者往下走会越界,这时应该不加这一步。

具体代码如下:

import numpy as np

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        
        if len(obstacleGrid) == 0:
            return 0
        
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        
        dp = np.zeros((m, n))
        dp[m-1][n-1] = 1  # 初始化
        
        
        for i in range(m-1, -1, -1):
            for j in range(n-1, -1, -1):
                
                if obstacleGrid[i][j] == 1:  # 如果当前位置是障碍,则往后的可走路径肯定是0
                    dp[i][j] = 0
                else: # 如果不是障碍,则考虑加上往右走的路径数和往下走的路径数,这里要注意防止越界
                    
                    # 加上往右走的
                    if j+1 <= n-1:
                        dp[i][j] += dp[i][j+1]
                    if i+1 <= m-1:
                        dp[i][j] += dp[i+1][j]
        
        return int(dp[0][0])
                    
                    
                
 

solution = Solution()
print(solution.uniquePathsWithObstacles([
  [0,0,0],
  [0,1,0],
  [0,0,0]
]))
        
        




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值