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

不同路径 2

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

1. 题目解析

题目地址点这里

2. 讲解算法原理


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

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

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

  • 将dp01初始化为1,表示从起点位置开始的路径数量为1。
  • 对于第一行和第一列的其他位置,由于只能向右或向下移动,如果遇到障碍物(obstacleGridi-1j-1为1),则路径数量为0;否则,路径数量与前一个位置的路径数量相同。
  1. 从网格的第二行第二列开始,依次填表。对于每个位置(i, j),计算dpij的值:
  • 如果当前网格位置不是障碍物(obstacleGridi-1j-1不等于1),说明可以从上方格子到达当前位置,路径数量为dpi-1j
  • 如果当前网格位置不是障碍物(obstacleGridi-1j-1不等于1),说明可以从左方格子到达当前位置,路径数量为dpij-1
  • 将上述两种路径数量相加,得到从起点到达当前位置的路径数量,并将其赋给dpij
  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++学习:基础知识的掌握
c++·visualstudio
江畔柳前堤6 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore7 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考8 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX9 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面10 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号10 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽10 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI10 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
C++ 老炮儿的技术栈11 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio