【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II

news2024/11/15 16:52:36

在这里插入图片描述

  • 博主简介:努力学习和进步中的的22级计科生
  • 博主主页: @Yaoyao2024
  • 每日一句: “ 路虽远,行则将至。事虽难,做则可成。”

前言

前言:动规五部曲
以下是《代码随想录》作者总结的动规五部曲

  • 确定dp数组(dp table)以及下标的含义
  • 确定递推公式(状态转移方程)
  • dp数组如何初始化
  • 确定遍历顺序
  • 举例推导dp数组

所有动态规划问题中,一个状态一定由上一个状态推导而来,这点就有别于贪心,贪心没有状态的推导更别说什么公式,贪心只是从局部选取最优解。

例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

动态规划中dp[j]是由dp[j-weight[i]]推导出来的,然后取max(dp[j], dp[j - weight[i]] + value[i])。

但如果是贪心呢,每次拿物品选一个最大的或者最小的就完事了,和上一个状态没有关系。

所以贪心解决不了动态规划的问题。

62. 不同路径

题目链接
在这里插入图片描述
🌷思路:
这题首先思想肯定还是图论里的深搜,将机器人的路径看作一个二叉树,求为终点的叶子节点的数量:
在这里插入图片描述

class Solution {
 private:
        int dfs(int x, int y, int m, int n){

            if(x>m||y>n) return 0;//当前位置已经越界
            if(x == m && y == n) return 1;
            return dfs(x+1,y,m,n)+dfs(x,y+1,m,n);
        }
    public:
        int uniquePaths(int m, int n) {
            return dfs(1,1,m,n);
        }
};

但是发现,这种深搜的解题思路会超出时间限制:
在这里插入图片描述

分析:因为整棵树的深度是m+n-1.那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已)
所以上面深搜代码的时间复杂度为O(2^(m + n - 1) - 1),可以看出,这是指数级别的时间复杂度,是非常大的

 🦄动态规划解题思路:

  • 1.确定dp数组及其下标含义:
    dp[x][y]表示从(0,0)位置出发,到(x,y)位置的路径个数(求:dp[m-1][n-1])
  • 2.确定递推公式:
    题目说了,只能向下或向下走,那么从(0,0)(x,y)位置的路径条数可以由这两个位置的路径条数相加得来,即:dp[x,y] = dp[x-1][y]+dp[x][y-1]
  • 3.dp数组如何初始化:
    由于只能向右和向下走,那么可以确定的是,dp[x][0]dp[0][y]都是为1
    for (int i = 0; i < m; i++) dp[i][0] = 1;
    for (int i = 0; i < n; i++) dp[0][i] = 1;
    
  • 4.dp数组的初始化顺序:
    因为当前位置只能从左边和上面推导而来,所以这两个位置必须先确定,即:从左到右逐层往下遍历
  • 5.举例推导dp数组
    在这里插入图片描述
    ✅正确代码:
class Solution {
    public:
        int uniquePaths(int m, int n) {
            vector < vector<int> > dp(m, vector <int>(n,0));
            //初始化
            for (int i = 0; i < m; i++) dp[i][0] = 1;
            for (int i = 0; i < n; i++) dp[0][i] = 1;
            
            //遍历
            for (int i = 1 ; i < m; i++){
                for (int j = 1; j < n; j++){
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
            return dp[m-1][n-1];
        }      
};

时间复杂度:O(m*n)

63. 不同路径 II

题目链接
在这里插入图片描述

🦄动态规划解题思路:

这题与上题的整体思路还是一致的,加了障碍物会影响两个地方:

  • dp数组的初始化
  • 状态转移方程(实际上在代码上没影响)

✅正确代码:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector < vector<int> > dp(m, vector <int>(n,0));
            //初始化
            for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
            for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++) dp[0][i] = 1;
            
            //遍历
            for (int i = 1 ; i < m; i++){
                for (int j = 1; j < n; j++){
                    if (obstacleGrid[i][j] == 1) continue; //当前有障碍物,说明到不了这个位置,continue,使dp[i][j]保持为0
                    // if(obstacleGrid[i][j-1] == 1 && obstacleGrid[i-1][j] == 1){dp[i][j] = 0 ;continue;}
                    // if(obstacleGrid[i][j-1] == 1) {dp[i][j] = dp[i-1][j]; continue;}
                    // if (obstacleGrid[i- 1][j] == 1){dp[i][j] = dp[i][j-1]; continue;}
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
             return dp[m-1][n-1];
    }
};

注释掉的代码加上也没有错,是因为我一开始认为状态方程根据前两个推到位置是否有障碍物需要做出改变。但是看到下图的推导过程,即使是障碍物,加上也是0,其实也没事!
在这里插入图片描述

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

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

相关文章

IDEA运行大项目启动卡顿问题

我打开了很多项目&#xff0c;然后又启动了一个大型项目时&#xff0c;启动到一半&#xff0c;弹出一个窗口&#xff0c;告诉我idea内存不够&#xff0c;怎么解决这个问题&#xff1f; 1、先把多余的项目关掉&#xff0c;再启动这个大项目&#xff0c; 2、如果还是不行就去修改…

u-boot 基础学习:板级配置 Kconfig 的包含

前言 u-boot 与 Linux 内核在嵌入式Linux开发中占有重要的地位&#xff0c;掌握 u-boot 的基础开发&#xff0c;可以大大提升开发能力&#xff0c;并提高开发的效率。 u-boot 下 如何配置 板级的Kconfig 呢&#xff1f;u-boot 下板级的 Kconfig 是怎么包含到 主目录下 Kconfig…

阿里云2核4G服务器支持多少人在线?多少钱?

阿里云2核4G服务器多少钱一年&#xff1f;2核4G5M带宽优惠价格199元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;2核4G服务器30元3个月&#xff0c;可以在阿里云官方活动查看2核4G配置详细报价 https://t.aliyun.com/U/bLynLC 阿里云2核4G服务器价格 2核4G…

Apache SeaTunnel 2.3.4 版本发布:功能升级,性能提升

​Apache SeaTunnel团队自豪地宣布2.3.4版本正式发布&#xff01;本次更新聚焦于增强核心功能&#xff0c;改善用户体验&#xff0c;并进一步优化文档质量。 此次版本发布带来了多项重要更新和功能增强&#xff0c;包括核心与API的修复、文档的全面优化、Catalog支持的引入&…

一文了解什么是园区网以及如何部署园区网

目录 一、局域网分类 二、园区网的业务部署内容 1、构建高可靠可冗余网络 2、组播业务的快速开展 3、语音业务的部署 4、网络安全的部署 5、网络管理和维护的应用 一、局域网分类 &#xff08;1&#xff09;园区网&#xff1a; 目的&#xff1a;让各种服务器提供服务 …

JavaEE之多线程

一.认识线程 1.多进程实现并发编程的不足之处&#xff1a; 引入多个进程的核心&#xff1a;实现并发编程&#xff08;c的CGI技术就是通过多进程的方式实现的网站后端开发&#xff09;。因为现在是一个多核cpu的时代&#xff0c;并发编程就是刚需。多进程实现并发编程&#xf…

第 2 个 Java Web 应用工程(JSP JavaBean DB)(含源码)(图文版)

JavaBean 是一种符合特定约定的 Java 类&#xff0c;通常用于在 Java 应用程序中封装数据以及提供对数据的访问和修改方法。 本文示例&#xff1a;建立一个 Tomcat 工程&#xff0c;编写一个 JSP 页面&#xff0c;调用 JavaBean 访问数据库并显示到页面上&#xff0c;发布到 T…

Linux 之一:Linux 简介、客户端、安装

Linux简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹于…

GitLab EE 企业版破解

在当今数字化时代&#xff0c;软件开发与团队协作已经成为现代企业不可或缺的一部分。而在这个过程中&#xff0c;版本控制、协作和持续集成等工具的运用变得至关重要。GitLab作为一个领先的、完整的DevOps平台&#xff0c;为团队提供了一个集成的解决方案&#xff0c;使得软件…

MySQL8.0性能优化实战培训课-高阶数据库实战课程来袭!!

课程介绍 众多已经学习过MySQL 8.0 OCP认证专家的课程的同学们对 MySQL 8.0 的安装部署、体系结构、配置监控、用户管理、主从复制、系统运维、MGR等基础操作和动手实验有了一定的学习基础.很多学员反馈希望更进一步提升技术能力、解决工作中碰到的性能问题。 针对MySQL8.0的数…

运维随录实战(4)

添加账号并为账号赋予root权限 1,使用root账号添加一个普通账号 adduser test passwd test # 赋予密码 2,赋予root权限 修改/etc/sudoers文件,如果使用vi 命令打开提示仅只读,则使用 visudo命令打开 在root下面添加一行“test ALL=(ALL) ALL”,如下所示 3,将test账…

电脑不小心格式化了,怎么恢复?

在这个数字化时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;有时我们可能会不小心格式化电脑硬盘&#xff0c;导致重要数据的丢失。那么&#xff0c;电脑不小心格式化了&#xff0c;怎么恢复&#xff1f; 别着急&#xff0c;在本篇攻略中&…

这里推荐一款unity3d人物动物控制器详细的等学会再写文章

unity3d Animal Controller 1.4.0a 动物NPC行为控制器 动物控制器&#xff08;AC&#xff09;是一个基于脚本架构的动画框架控制器。它适用于任何动物或人形角色的根运动或原地动画。 人和动物的各种动作都有; 小白必选、 我只是运行乐demo就感觉牛 demo路径&#xff1a;Asset…

Python实现ADTM工具判断信号:股票技术分析的工具系列(6)

Python实现ADTM工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;6&#xff09; 介绍算法解释 代码rolling函数介绍完整代码data代码ADTM.py 介绍 ADTM&#xff08;动态买卖气指标&#xff09;是一种用于衡量市场买卖力量对比的指标。它通过计算动态买盘指标&#…

IDEA2023.2版本引用提示no usages的关闭和打开

相信很多下载使用高版本的IDEA的小伙伴们都会发现自己的代码主页会出现一个no usages的提示,如下图所示,其实这是IDEA所做出的来的一个辅助功能,目的是为了让使用者可以清楚的知道你在哪里被使用了;如图: 对于一些经常使用低版本的IDEA编程的小伙伴来说,这个功能的突然出…

S3---FPGA-A7板级电源硬件实战

视频链接 FPGA-A7板级电源硬件实战01_哔哩哔哩_bilibili FPGA-A7板级电源硬件实战 1、基于A7 板级的系统框图 2、基于A7 板级的电源设计细则 2.1、A7 FPGA功耗评估 Artix-7 FPGA电源有VCCINT, VCCBRAM, VCCAUX, VCCO, VMGTAVCC和VMGTAVTT。 2.1.1、A7 FPGA电源管脚 2.1.2…

GIS之深度学习05:VisualStudio安装教程

在安装CUDA前&#xff0c;建议先安装VisualStudio&#xff0c;以防报错 VisualStudio安装步骤简单&#xff0c;但时间较长。。。。。。 正文开始&#xff1a; VisualStudio官网&#xff1a;Visual Studio: IDE and Code Editor for Software Developers and Teams 点击右上角…

【观点】区块链的未来:分布式商业;企业的未来:分布式商业生态战略

本文内容摘自思二勋所著的《分布式商业生态战略》一书。 近两年&#xff0c;商业经济环境的不确定性越来越明显&#xff0c;市场经济受到疫情、技术、政策等多方因素影响越来越难以预测&#xff0c;黑天鹅事件时有发生。在国内外经济方面&#xff0c;国际的地缘政治对商业经济…

[LeetBook]【学习日记】寻找和为指定数字的连续数字

题目 文件组合 待传输文件被切分成多个部分&#xff0c;按照原排列顺序&#xff0c;每部分文件编号均为一个 正整数&#xff08;至少含有两个文件&#xff09;。传输要求为&#xff1a;连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组…

VM新建虚拟机

目录 一、前言二、下载镜像三、新建虚拟机 一、前言 上一篇文章我们介绍了VMware Workstation 15 Pro的安装与破解 &#xff0c;这篇文章我们介绍一下新建虚拟机 二、下载镜像 Linux使用最多的是CentOS和Ubuntu&#xff0c;下面是下载地址 Centos7:https://www.centos.org/…