😊博主目前也在学习,有错误欢迎指正😊
🌈保持热爱 奔赴星海🌈
文章目录
- 一、题目
- 1、题目描述
- 2、基础框架
- 3、原题链接
- 二、解题报告
- 1、思路分析
- 2、代码详解
- 三、本题知识
一、题目
1、题目描述
给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。返回机器人能够到达右下角的不同路径数量。测试用例保证答案小于等于 2 * 109。
2、基础框架
- C++版本框架代码如下:
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {}
};
3、原题链接
63. 不同路径 II
二、解题报告
1、思路分析
(1)对于每一个方格,只会有两种情况,要么从上面来,要么从左边来。
(2)这题可以用动态规划,dp[i][j]表示从(0,0)走到(i,j)的路径的数量,计算dp[i][j]只需要计算dp[i - 1][j]和dp[i][j - 1]和即可。对于第一行和第一列先进行初始化,用于计算后续的dp[i][j]。
2、代码详解
class Solution {
public:int res = 0;int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();vector<vector<int>> dp(m, vector<int>(n));//初始化状态转移数组dp[0][0] = !obstacleGrid[0][0];for(int i = 1;i < n;i++) {if(obstacleGrid[0][i]) {dp[0][i] = 0;}else {dp[0][i] = dp[0][i - 1];}}for(int i = 1;i < m;i++) {if(obstacleGrid[i][0]) {dp[i][0] = 0;}else {dp[i][0] = dp[i - 1][0];}}//动态规划for(int i = 1;i < m;i++) {for(int j = 1;j < n;j++) {if(obstacleGrid[i][j] == 0) {dp[i][j] += dp[i - 1][j];dp[i][j] += dp[i][j - 1];}}}return dp[m - 1][n - 1];}
};
三、本题知识
动态规划