zoukankan      html  css  js  c++  java
  • 63. Unique Paths II

    63. Unique Paths II

    1 题目

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

    Now consider if some obstacles are added to the grids. How many unique paths would there be?

    dp

    An obstacle and empty space is marked as 1 and 0 respectively in the grid.

    Note: m and n will be at most 100.

    Example 1:

    Input:
    [
      [0,0,0],
      [0,1,0],
      [0,0,0]
    ]
    Output: 2
    Explanation:
    There is one obstacle in the middle of the 3x3 grid above.
    There are two ways to reach the bottom-right corner:
    1. Right -> Right -> Down -> Down
    2. Down -> Down -> Right -> Right
    

    2. 思路

    本题和之前的 62 Unique Paths 都是求机器人从左上角到右下角有几种走法。所不同的是,这次机器人行走的过程中有了障碍。如果输入的矩阵中,obstacleGrid[i] [j] == 1 则代表了这个地方不能行走。同样,本题也是使用动态规划完成。设dp [i] [j] 是机器人走到第i行,第j列的走法总数:

    1. 如果obstacleGrid[i] [j] == 1 则,dp[i] [j] = 0 。如果当前步有障碍,则走法肯定是0
    2. 如果obstacleGrid[i] [j] != 1 则,dp[i] [j] = dp[i-1] [j] + dp[j-1] [i]

    构建完递推表达式,还需要初始化下第0行和第0列,构建的规则和上面的递推式是一样的,只不过i和j换成了0:

    row = len(obstacleGrid) 
            col = len(obstacleGrid[0]) 
            dp = [  [ 0 for j in range(col)] for i in range(row) ] 
            
            if obstacleGrid[0][0] == 1 :
                return 0 
            else:
                dp[0][0] = 1 
        
            for i in range(1,row):
                if obstacleGrid[i][0] == 1 :
                    dp[i][0] = 0 
                else:
                    dp[i][0] = dp[i-1][0]
                    
            for j in range(1,col):
                if obstacleGrid[0][j] == 1 :
                    dp[0][j] = 0 
                else:
                    dp[0][j] = dp[0][j-1]
    

    3. 实现

    class Solution(object):
        def uniquePathsWithObstacles(self, obstacleGrid):
            """
            :type obstacleGrid: List[List[int]]
            :rtype: int
            """
            row = len(obstacleGrid) 
            col = len(obstacleGrid[0]) 
            dp = [  [ 0 for j in range(col)] for i in range(row) ] 
            
            if obstacleGrid[0][0] == 1 :
                return 0 
            else:
                dp[0][0] = 1 
        
            for i in range(1,row):
                if obstacleGrid[i][0] == 1 :
                    dp[i][0] = 0 
                else:
                    dp[i][0] = dp[i-1][0]
                    
            for j in range(1,col):
                if obstacleGrid[0][j] == 1 :
                    dp[0][j] = 0 
                else:
                    dp[0][j] = dp[0][j-1]
                    
            for i in range(1,row):
                for j in range(1,col):
                    if obstacleGrid[i][j] == 1 :
                        dp[i][j] = 0
                    else:
                        dp[i][j] = dp[i-1][j] + dp[i][j-1]
            return dp[row-1][col-1]
                    
                    
    
  • 相关阅读:
    软件可靠性与安全性设计与实现知识梳理(软件可靠性与安全性高级技术研讨会心得)
    SSM框架整合
    不注册Tomcat服务,运行Tomcat不弹出JAVA控制台窗口
    ExtJS表单之复选框CheckboxGroup展示与取值
    ExtJS获取父子、兄弟容器元素方法
    LabVIEW之生产者/消费者模式--队列操作 彭会锋
    ExtJS Grid导出excel文件
    jeesite部署到Tomcat后,无法访问,cannot be resolved in either web.xml or the jar files deployed with this application
    滚动轮播插件——jCarouselLite
    统计学基础之假设检验
  • 原文地址:https://www.cnblogs.com/bush2582/p/10926078.html
Copyright © 2011-2022 走看看