算法---动态规划练习-4(不同路径 2)

不同路径 2

  • [1. 题目解析](#1. 题目解析)
  • [2. 讲解算法原理](#2. 讲解算法原理)
  • [3. 编写代码](#3. 编写代码)

1. 题目解析

题目地址点这里

2. 讲解算法原理


  1. 首先,通过obstacleGrid的大小确定网格的行数m和列数n。

  2. 创建一个大小为(m+1) × (n+1)的二维动态规划数组dp,其中dp[i][j]表示从起点到达网格位置(i-1, j-1)的路径数量。

  3. 初始化动态规划数组的第一行和第一列:

  • 将dp[0][1]初始化为1,表示从起点位置开始的路径数量为1。
  • 对于第一行和第一列的其他位置,由于只能向右或向下移动,如果遇到障碍物(obstacleGrid[i-1][j-1]为1),则路径数量为0;否则,路径数量与前一个位置的路径数量相同。
  1. 从网格的第二行第二列开始,依次填表。对于每个位置(i, j),计算dp[i][j]的值:
  • 如果当前网格位置不是障碍物(obstacleGrid[i-1][j-1]不等于1),说明可以从上方格子到达当前位置,路径数量为dp[i-1][j];
  • 如果当前网格位置不是障碍物(obstacleGrid[i-1][j-1]不等于1),说明可以从左方格子到达当前位置,路径数量为dp[i][j-1]。
  • 将上述两种路径数量相加,得到从起点到达当前位置的路径数量,并将其赋给dp[i][j]。
  1. 最后,返回动态规划数组中右下角位置(m, n)的值,即从起点到达终点的路径数量。

3. 编写代码

cpp 复制代码
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int n=obstacleGrid[0].size();
        int m=obstacleGrid.size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        dp[0][1]=1;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(obstacleGrid[i-1][j-1]!=1) 
                dp[i][j]=dp[i][j-1]+dp[i-1][j];
            }
        }
            return dp[m][n];
    }
};
相关推荐
似水এ᭄往昔5 分钟前
【C++】--封装红⿊树实现mymap和myset
开发语言·数据结构·c++·算法·stl
咕噜企业分发小米6 分钟前
腾讯云向量数据库HNSW索引如何更新?
人工智能·算法·腾讯云
charlie1145141919 分钟前
嵌入式现代C++教程:C++98——从C向C++的演化(3)
c语言·开发语言·c++·笔记·学习·嵌入式
lcreek11 分钟前
LeetCode215. 数组中的第K个最大元素、LeetCode912. 排序数组
python·算法·leetcode
moonquakeTT14 分钟前
C++:深拷贝与浅拷贝
c++
程序员zgh16 分钟前
C语言 指针用法与区别(指针常量、常量指针、指针函数、函数指针、二级指针)
c语言·开发语言·jvm·c++
Einsail25 分钟前
天梯赛题解(3-6)
算法
杜子不疼.26 分钟前
【LeetCode 852 & 162_二分查找】山脉数组的峰顶索引 & 寻找峰值元素
算法·leetcode·职场和发展
山楂树の30 分钟前
搜索插入位置(二分查找)
数据结构·算法
冉佳驹32 分钟前
C++ ——— 仿函数的使用、继承方式、赋值转换规则、菱形继承与虚继承
c++·继承·virtual·仿函数·菱形继承·模板特化·虚继承