LeetCode刷题笔记【30】:动态规划专题-2(不同路径、不同路径 II)

news2024/9/21 2:38:28

文章目录

  • 前置知识
  • 62.不同路径
    • 题目描述
    • 解题思路
    • 代码
  • 63. 不同路径 II
    • 题目描述
    • 障碍信息传递法(比较复杂)
    • 被障碍物阻挡后直接清空计数法(更简洁)
  • 总结

前置知识

参考前文

参考文章:
LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯)

62.不同路径

题目描述

截图

LeetCode链接:https://leetcode.cn/problems/unique-paths/description/

解题思路

动态规划: 创建m×n的数组, 对应这个地图, 数组val表示有几种方法可以走到这一格
最开始, 第一行和第一列val都是1, 然后依次遍历更新val
每一格的val是其上和左格子的和

代码

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> map(m, vector<int>(n));
        for(int i=0; i<n; i++){
            map[0][i] = 1;
        }
        for(int i=0; i<m; i++){
            map[i][0] = 1;
        }
        for(int i=1; i<m; i++){
            for(int j=1; j<n; j++){
                map[i][j] = map[i-1][j] + map[i][j-1];
            }
        }
        return map[m-1][n-1];
    }
};

63. 不同路径 II

题目描述

截图

LeetCode链接:https://leetcode.cn/problems/unique-paths-ii/description/

障碍信息传递法(比较复杂)

参考<62. 不同路径>
动态规划, 先把石头初始化为INT_MAX(并且初始化过程中前面一个是INT_MAX, 那他自己也是INT_MAX)

递推遍历的过程中加一个判断
① 如果左和上都是INT_MAX, 那么本位置也是INT_MAX
② 如果上/左有一个是INT_MAX, 那么val是另一个非INT_MAX
③ 正常递推

class Solution {
private:
    int maxNum = INT_MAX;
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        for(int i=0; i<obstacleGrid.size(); ++i){
            for(int j=0; j<obstacleGrid[0].size(); ++j){
                if(obstacleGrid[i][j]==1)
                    obstacleGrid[i][j] = maxNum;
            }
        }

        if(obstacleGrid[0][0] != maxNum)
            obstacleGrid[0][0] = 1;
        for(int i=1; i<obstacleGrid[0].size(); ++i){
            if(obstacleGrid[0][i-1]==maxNum)
                obstacleGrid[0][i] = maxNum;
            if(obstacleGrid[0][i] != maxNum)
                obstacleGrid[0][i] = 1;
        }
        for(int i=1; i<obstacleGrid.size(); ++i){
            if(obstacleGrid[i-1][0]==maxNum)
                obstacleGrid[i][0] = maxNum;
            if(obstacleGrid[i][0] != maxNum)
                obstacleGrid[i][0] = 1;
        }

        for(int i=1; i<obstacleGrid.size(); ++i){
            for(int j=1; j<obstacleGrid[0].size(); ++j){
                if(obstacleGrid[i][j]==maxNum)
                    continue;
                int left = obstacleGrid[i-1][j];
                int over = obstacleGrid[i][j-1];
                if(left==maxNum && over==maxNum){
                    obstacleGrid[i][j] = maxNum;
                }else if(left==maxNum || over==maxNum){
                    obstacleGrid[i][j] = min(left, over);
                }else{
                    obstacleGrid[i][j] = left + over;
                }
            }
        }

        if(obstacleGrid.back().back()==maxNum)
            return 0;
        else
            return obstacleGrid.back().back();
    }
};

这样做相当于是如果在过程中遇到了障碍物, 就把这个障碍物的信息继续往后传递, 一直到遍历结束.

这样当然可以解决问题, 并且整个遍历的过程也非常符合手工推导的直觉.
但是落实到代码层面的话, 不管是初始化的过程, 推导的过程, 还是最后得出结果的步骤, 都会变得更加繁琐, 不够简洁.

被障碍物阻挡后直接清空计数法(更简洁)

另一种思路: 将obstacleGrid试做参考, 自己新建一个map;

在遍历过程中如果当前位置有障碍物, 那么就直接给当前位置赋值0(清空前面的累计计数);
其含义也可以理解为: 有0种方法可以走到当前位置.

在初始化时, 遇到障碍物, 直接停止初始化.

class Solution {
private:
    int maxNum = INT_MAX;
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m=obstacleGrid.size();
        int n=obstacleGrid[0].size();
        if(obstacleGrid[0][0]==1 || obstacleGrid[m-1][n-1]==1)//一些trick, 起点终点处有障碍物就没法走了
            return 0;
        vector<vector<int>> map(m, vector<int>(n));
        for(int i=0; i<n; i++){
            if(obstacleGrid[0][i]==1)
                break;
            map[0][i] = 1;
        }
        for(int i=0; i<m; i++){
            if(obstacleGrid[i][0]==1)
                break;
            map[i][0] = 1;
        }
        for(int i=1; i<m; i++){
            for(int j=1; j<n; j++){
                if(obstacleGrid[i][j]==1)
                    continue;
                map[i][j] = map[i-1][j] + map[i][j-1];
            }
        }
        return map[m-1][n-1];
    }
};

总结

动态规划做起来真的比贪心舒服很多很多, 有逻辑的通畅感觉.

今天第二道题是第一道题的延伸拓展, 我虽然也做出来了, 但是用程序强行实现的手工推导思路, 并没有贴合dp数组的定义与实质.
导致算法不够简洁有力.
或许以后随着练习, 可以逐渐加强.

本文参考:
不同路径
不同路径 II

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码随想录】Day 45 动态规划7 (爬楼梯(进阶)、零钱兑换、完全平方数)

爬楼梯&#xff08;进阶&#xff09; https://leetcode.cn/problems/climbing-stairs/ 零钱兑换 https://leetcode.cn/problems/coin-change/ 完全平方数 https://leetcode.cn/problems/perfect-squares/

GE IS220PAICH2A 336A4940CSP11 数字量输入模块产品应用领域

GE IS220PAICH2A 336A4940CSP11 是一款数字量输入模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;用于监测和采集数字输入信号。这种类型的模块可以在各种应用领域中发挥作用&#xff0c;以下是一些可能的应用领域&#xff1a; 工业过程控制&#xff1a; GE IS220…

九个月内累计被罚1.3亿元,知网为何屡触法网

大数据产业创新服务媒体 ——聚焦数据 改变商业 9月6日&#xff0c;国家网信办根据《个人信息保护法》作出顶格处罚&#xff0c;对中国知网处以5000万元的罚款。 国家网信办的调查发现&#xff0c;知网运营的手机知网、知网阅读等14款APP存在违反必要原则收集个人信息、未经同…

怎么把照片变成视频?分享个简单的制作方法

在现代社交网络中&#xff0c;图文视频已成为非常流行的视觉语言。由于图文视频具有强烈的视觉吸引力和交互性&#xff0c;它们已成为许多人在社交媒体上分享自己的生活和经历的首选方式。以下是制作图文视频的步骤&#xff1a; Step 1 首先&#xff0c;我们需要选取一些照片来…

图片上的字怎么去掉?尝试下这几种简单操作方法

在设计中&#xff0c;图片通常被用来传达信息或增强视觉效果。然而&#xff0c;有时候图片中的文字可能会干扰到内容的阅读或降低整体设计的美感。除此之外&#xff0c;如果图片中的文字已经在其他地方出现过了&#xff0c;比如在正文或标题中&#xff0c;那么重复使用文字会让…

基于轻量级神经网络GhostNet开发构建的200种鸟类细粒度识别分析系统

最近项目需要用到轻量级的网络模型&#xff0c;后期考虑进一步的剪枝和量化达到加速推理的目的&#xff0c;正好有时间就想着基于实际的数据集来开发构建项目做测试&#xff0c;本文的核心目的就是选定轻量级神经网络模型GhostNet来开发构建细粒度鸟类识别系统&#xff0c;首先…

MySQL服务关闭开机自启,改成手动启动状态

最近在写前端&#xff0c;所以就先把后端数据库禁用或手动启动吧。防止浪费太多内存或资源。一般就之前损坏了的数据库就禁用吧&#xff0c;其他最近不常用的服务就没必要开机自启动吧&#xff0c;毕竟电脑只有一台&#xff0c;不想学习想用电脑来玩的话就讲工作服务从开机自启…

数字出版软件系统开发

数字出版涵盖了广泛的内容&#xff0c;从电子书到数字杂志、在线期刊和互动教育教材等。为了实现这些数字出版物&#xff0c;有许多不同类型的软件系统可供使用&#xff0c;每种都有自己的特点和功能。以下是一些常见的数字出版软件系统以及它们主要实现的功能&#xff0c;希望…

国标视频云服务EasyGBS国标视频平台设备录像下载文件为ps格式,如何改为MP4格式?

EasyGBS是基于国标GB/T28181协议的视频云服务平台&#xff0c;不仅支持无缝、完整接入内网或者公网的国标设备&#xff0c;在输出上&#xff0c;提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务&#xff0c;实现全平台、全终端输出。 有用户反馈&#xff0c;在使用…

ubuntu 扩展内存挂载

一般新建虚拟机时&#xff0c;系统默认的空间是20G&#xff0c;但是当我们搭建一些环境之后&#xff0c;需要解压一些稍微大点的源码时内存可能不够用了&#xff0c;这时我们需要扩展内存。 一、硬盘扩展 首先&#xff0c;关闭虚拟机&#xff0c;在虚拟机设置中将硬盘容量扩展…

PMP认证的用处是什么?做哪些工作需要?

PMP是项目管理证书&#xff0c;是PMI组织&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试。随着在国内传播和影响力的增加&#xff0c;如今在各大招聘平台去看项目经理之类的职位&#xff0c;大多数要求会有“PMP证书优先”。在一些大型企业&#xff0c…

【开源三方库】crypto-js加密算法库的使用方法

OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;三方库&#xff0c;是经过验证可在OpenHarmony系统上可重复使用的软件组件&#xff0c;可帮助开发者快速开发OpenHarmony应用。如果是发布到开源社区&#xff0c;称为开源三方库&#xff0c;开发者可以通过访问…

antd中 a-table表格组件跨页勾选,数据回显勾选的问题

踩坑&#xff1a;a-table翻页勾选数据丢失&#xff0c;数据回显勾选 需求&#xff1a;input框显示勾选的所有数据里面的name组成的字符串&#xff0c;点击后面的图标弹出弹框&#xff0c;并且之前选择的数据需要回显勾选。如下图所示 <a-card :bordered"false"&…

苹果笔有必要买吗?ipad可以用的手写笔

众所周知&#xff0c;现在网上越来越多平替电容笔的出现&#xff0c;无论是价格和功能&#xff0c;几乎都很接近。很多小伙伴不知如何下手&#xff0c;不知道如何从众多品牌中挑选出适合自己的电容笔&#xff0c;今天我为大家总结一下网上几款热销&#xff0c;平价的国货品牌电…

【计算机基础知识6】跨域问题及解决方案

目录 前言 一、什么是跨域问题&#xff1f; 二、为什么会出现跨域问题&#xff1f; 三、常见的跨域解决方法 1. JSONP&#xff08;JSON with Padding&#xff09; 2. CORS&#xff08;跨域资源共享&#xff09; 3. 代理服务器 4. postMessage() 前言 跨域是前端开发中经…

2023高教社杯数学建模E题思路代码 - 黄河水沙监测数据分析

# 1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

win11切换输入法快捷键怎么设置

win11系统有自动的切换输入法的快捷键&#xff0c;如果我们觉得系统默认的快捷键使用起来不习惯的话&#xff0c;我们可以将切换输入法的快捷键进行更改设置&#xff0c;这里小编就给大家带来win11输入法切换快捷键的设置方法&#xff0c;感兴趣的小伙伴快来看看吧。 win11输入…

企业变更记录查询API:解密企业演变的关键数据

前言 随着市场竞争的不断升级和商业环境的动态变化&#xff0c;企业必须不断适应新的情况和变革。在这个过程中&#xff0c;企业的变更记录成为了关键的数据&#xff0c;它可以帮助企业了解自己的发展历程、监测竞争对手的动态、评估市场趋势和满足法律法规的合规要求。为了解…

Fair|Fur —— Object Nodes

目录 Guide Groom Guide Deform Guide Merge Hair Generate Guide Simulate Hair Card Generate Guide Groom 从skin几何体生成引导线&#xff0c;并在其节点内可进一步处理引导线&#xff1b;内嵌Hair Generate节点&#xff1b; 注&#xff1a;skin几何体应是静态的&am…

关于一次blog性能测试的过程和疑问

找了搭建的一个博客网站&#xff0c;拿来试着测了测&#xff0c;想看一下性能能达到什么目标&#xff1b; 测试过程中遇到一些问题&#xff0c;还无法凭自己找到原因&#xff0c;测试过程记录下来&#xff0c;希望有热心大佬多多指教&#xff1b; 目录 基准测试场景 1、首页…