zoukankan      html  css  js  c++  java
  • LeetCode 63. 不同路径 II(Unique Paths II)

    题目描述

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    网格中的障碍物和空位置分别用 10 来表示。

    说明:m 和 n 的值均不超过 100。

    示例 1:

    输入:
    [
      [0,0,0],
      [0,1,0],
      [0,0,0]
    ]
    输出: 2
    解释:
    3x3 网格的正中间有一个障碍物。
    从左上角到右下角一共有 2 条不同的路径:
    1. 向右 -> 向右 -> 向下 -> 向下
    2. 向下 -> 向下 -> 向右 -> 向右
    

    解题思路

    典型的动态规划思想,每个方框的路径数等于其紧邻上方的路径数与紧邻左方的路径数之和,如果此方框是障碍物,则路径数为0.

    代码

     1 class Solution {
     2 public:
     3     int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
     4         int rows = obstacleGrid.size(), cols = obstacleGrid[0].size();
     5         vector<vector<int>> dp(rows, vector<int>(cols, 1));
     6         for(int i = 0; i < rows; i++){
     7             for(int j = 0; j < cols; j++){
     8                 if(obstacleGrid[i][j] == 1)
     9                     dp[i][j] = 0;
    10                 else if(!(i == 0 && j == 0)){
    11                     int left = j == 0 ? 0 : dp[i][j - 1];
    12                     int up = i == 0 ? 0 : dp[i - 1][j];
    13                     dp[i][j] = left + up;
    14                 }
    15             }
    16         }
    17         return dp[rows - 1][cols - 1];
    18     }
    19 };
  • 相关阅读:
    SSL 1010——方格取数
    SSL 1558——科技庄园
    SSL 2295——暗黑破坏神
    SSL 2294——打包
    SSL 2293——暗黑游戏
    SSL 2305——竞赛总分
    SSL 1072——砝码称重
    SSL 2291——分组背包
    SSL 2290——潜水员
    SSL 2301——混合背包
  • 原文地址:https://www.cnblogs.com/wmx24/p/9429591.html
Copyright © 2011-2022 走看看