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

在这里插入图片描述

  • 博主简介:努力学习和进步中的的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.mfbz.cn/a/417702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[LeetCode]143.重排链表

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reorder-list/description/ 题目 示例 解题思路 寻找链表中点 链表逆序 合并链表 注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。 这样我们的任务即可划分为三步&a…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…

安卓开发1- android stdio环境搭建

安卓开发1-android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环…

Sora技术原理解析

1.Sora简介 Sora是一个基于大规模训练的文本控制视频生成扩散模型。 Sora能够生成高达1分钟的高清视频&#xff0c;涵盖广泛的视觉数据类型和分辨率。 Sora使用简单的文本描述&#xff0c;使得视频创作变得前所未有的简单和高效。 Sora的一些能力&#xff1a; Text-to-video…

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Qt篇——QTableWidget选中多行右键删除

效果如图&#xff1a; 代码如下&#xff1a; 头文件中&#xff1a; QTableWidgetItem *selectedItem; //表格被选中的一行 QMenu* originDataTableContextMenu; //表格右键菜单 QAction* originDataTableActionDel; //表格右键菜单…

腾讯云又双叕降价,云服务器配置优惠价格表2024新版报价

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

分组背包(相关解析及例题)

1.概念 分组背包&#xff1a; 分组背包就是有n组物品&#xff0c;每组物品中只可以选择一个物品。 每个物品都有体积和价值&#xff0c;求总体积不超过m的情况下的价值最大值。 那么我们就可以通过概念来得到状态转移方程&#xff1a; dp[ j ]max(dp[ j ],dp[ j -w[ i ][ …

打造透明银行存储:Solidity智能合约的实践与探索

引言&#xff1a; 随着区块链技术的快速发展&#xff0c;智能合约作为其中的核心组件&#xff0c;正被越来越多地应用于各种场景。作为智能合约的编程语言&#xff0c;Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中&#xff0c;我们将通过构建一个透明的银行存储…

RT-Thread+ENV+MDK+STM32CubeMX适配

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动/单片机/RTOS的实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff…

45、WEB攻防——通用漏洞PHP反序列化POP链构造魔术方法原生类

文章目录 序列化&#xff1a;将java、php等代码中的对象转化为数组或字符串等格式。代表函数serialize()&#xff0c;将一个对象转换成一个字符&#xff1b;反序列化&#xff1a;将数组或字符串等格式还成对象。代表函数unserialize()&#xff0c;将字符串还原成一个对象。 P…

基于ESP32的MicroPython项目量产烧写指南

背景 前段时间用MicroPython开发了一个项目&#xff0c;硬件是ESP32-C3&#xff0c;目前准备量产&#xff0c;我需要提供固件以供加工厂批量烧录&#xff0c;需要把我有程序的板子里的程序读出来&#xff0c;然后下到别的板子上&#xff0c;以下做这件事情的过程记录。 1.固件…

mysql5.7源码安装

1.下载MySQL源码包 mysql-5.7.30.tar.gz 2.下载Boost库 tar xf /usr/local/src/boost_1_59_0.tar.bz2 3.解压源码包到指定的目录&#xff1a;安装 mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DSYSCONFDIR/etc \ -DWITH_MYISAM_STORA…

ElasticSearch架构介绍及原理解析

ElasticSearch架构介绍及原理解析文章目录 一、Elasticsearch是什么&#xff1f;1.简介2.历史与发展3.有关概念1.cluster2.shards3.replicas4.recovery5.river6.gateway7.discovery.zen8.Transport 4.安装 二、ElasticSearch架构介绍及原理解析1.基本架构1.1 进程节点1.2 负载均…

人工智能_大模型010_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0145

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来 右侧有下载按钮.点击下载可…

Programming Abstractions in C阅读笔记:p306-p307

《Programming Abstractions in C》学习第75天&#xff0c;p306-p307总结&#xff0c;总计2页。 一、技术总结 1.Quicksort algorithm(快速排序) 由法国计算机科学家C.A.R(Charles Antony Richard) Hoare&#xff08;东尼.霍尔&#xff09;在1959年开发(develop), 1961年发表…

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言&#xff1a;顺序表回顾&#xff1a; 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…

LeetCode——栈和队列(Java)

栈和队列 简介[简单] 232. 用栈实现队列[简单] 225. 用队列实现栈[简单] 20. 有效的括号[简单] 1047. 删除字符串中的所有相邻重复项[中等] 150. 逆波兰表达式求值[困难] 239. 滑动窗口最大值[中等] 347. 前 K 个高频元素 简介 记录一下自己刷题的历程以及代码。写题过程中参考…

【Linux】进程优先级以及Linux内核进程调度队列的简要介绍

进程优先级 基本概念查看系统进程修改进程的优先级Linux2.6内核进程调度队列的简要介绍和进程优先级有关的概念进程切换 基本概念 为什么会存在进程优先级&#xff1f;   进程优先级用于确定在资源竞争的情况下&#xff0c;哪个进程将被操作系统调度为下一个运行的进程。进程…

Linux设备模型(七) - Netlink

一&#xff0c;什么是netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket&#xff0c;它是 Linux 所特有的。 Netlink 是一种在内核与用户应用间进行双向数…