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]
                    
                    
    
  • 相关阅读:
    final .....finally ...... 和Finalize ......区别
    MyEclipse中常用的快捷键大全,快来.....
    简单的描述Java中的构造函数,及访问修饰符
    分层开发---酒店管理系统---
    C#深入.NET平台的软件系统分层开发
    影院售票系统-----一个让你有成就感的小项目,只有一丢丢哦
    mysql数据库进阶
    MySQL练习
    MySQL中常见函数
    TCP协议之三次握手四次挥手
  • 原文地址:https://www.cnblogs.com/bush2582/p/10926078.html
Copyright © 2011-2022 走看看