IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【leetcode】63. 不同路径 II。 「动态规划」 -> 正文阅读

[数据结构与算法]【leetcode】63. 不同路径 II。 「动态规划」

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

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

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

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

示例 1:
请添加图片描述

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

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右
    示例 2:

在这里插入图片描述

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

m == obstacleGrid.length,(c++)为size()
n == obstacleGrid[i].length,(c++)为size()
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1

思路:
很显然,这道题可以使用动态规划来做.我们先确认动态规划的状态转移方程,因为每次只能往右边或者下面移动,所以每次都有两种移动的方案,而这样就可以得出每一个位置处的前一步必定为上方或者左方,也就可以得出路线数为上方位置的路线数加上左方的路线数.这样也就列出了状态转移方程了,即res[i][j]=res[i -1][j] + res[i][j - 1],当此处没有障碍物时.有障碍物就res等于0;

然后我们再分析一下初始条件,动动脑子可得,第一行和第一列上的不管哪个位置都是有且只有一条路线的,一路畅通就res都赋值为1,有障碍物就从障碍物开始以后的res为0,因为路被挡死了.

然后就可以通过循环来把对应的结果得出了.

要记得初始化为0,要不然遇到一些一开始就给你障碍物的就寄了.

如果要用vector的话就可以这样创建二维动态数组,都初始化为0

vector<vector<int>> res(n, vector<int>(m, 0));

当然可以简单地使用数组,用memset来进行初始化

int res[n][m];
memset(res, 0, sizeof(res));

代码区:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int n = obstacleGrid.size();//行数
        int m = obstacleGrid[0].size();//列数
        vector<vector<int>> res(n, vector<int>(m, 0));//建立n行m列初始化为0的动态二维数组
        for(int i = 0; i < n && obstacleGrid[i][0] != 1; i++){
            //加一个条件就可以实现当遇到1时停止赋值,因为已经过不去了,死路默认值为0
            res[i][0] = 1;
        }
        for(int j = 0; j < m && obstacleGrid[0][j] != 1; j++){
            //同上
            res[0][j] = 1;
        }
        for(int i = 1; i < n; i++){//从非第一行列开始进行判断,
            for(int j = 1; j < m; j++){
                if(obstacleGrid[i][j] == 0){//只有通路时进行路线的相加,即上方和左方的路线相加
                    res[i][j] = res[i - 1][j] + res[i][j - 1];
                }
                //因为已经初始化过了,所以不用考虑有障碍物,默认为0
            }
        }
        //返回最终的结果
        return res[n - 1][m - 1];
    }
};

新手上路,有错请指正;

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:43:30  更:2022-03-16 22:49:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:36:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码