【算法历练】动态规划副本—路径问题

                                               🎬慕斯主页:修仙—别有洞天

                                              ♈️今日夜电波:宙でおやすみ

                                                                1:02━━━━━━️💟──────── 2:45
                                                                    🔄   ◀️   ⏸   ▶️    ☰   

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


 

目录

62.不同路径

解题思路:

63.不同路径||

解题思路:

LCR 166.珠宝的最高价值

解题思路:

931.下降路径最小和

解题思路:

64.最小路径和

解题思路:


62.不同路径

62. 不同路径

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

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

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。对于二维dp我们可以按照以[i,j]为结尾时,巴拉巴拉 的模板来进行描述。本题的状态表示为:dp[i][j]表示:走到[i,j]位置时,一共有多少种方式。

2、状态转移方程:根据题意,我们按照最近的一步划分问题。可知有两种最近的一步,即:

因此,我们可以根据上述的思想写出状态转移方程:

3、初始化(重点):在这里需要根据状态转移表示进行初始化,根据上面的状态转移方程,我们可以知道如果直接初始化需要将dp[0][j]、dp[i][0]都等于1才能完成初始化。但是我们在这里多加一横多加一列来初始化,让初始化更简单,也是防止越界。可以根据下图理解:

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

        因此我们写出如下题解:

class Solution {
public:int uniquePaths(int m, int n) {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++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m][n];}
};

63.不同路径||

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
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。本题是上一题的拓展,只是多了一个障碍而已。本题的状态表示为:dp[i][j]表示:走到[i,j]位置时,一共有多少种方式。由于多了一个障碍,我们只需要加上一个判断:if(obstacleGrid[i-1][j-1]!=1)即可规避障碍。

2、状态转移方程:实际上还是和上一题一样的,即:dp[i][j]=dp[i-1][j]+dp[i][j-1];

3、初始化(重点):同上一题

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

        因此我们写出如下题解:(需要注意我们的dp表是加了一行一列的,因此对于obstacleGrid要对应上需要横和列都-1)

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {vector<vector<int>> dp(obstacleGrid.size()+1,vector<int>(obstacleGrid[0].size()+1));dp[0][1]=1;for(int i=1;i<=obstacleGrid.size();i++){for(int j=1;j<=obstacleGrid[0].size();j++){if(obstacleGrid[i-1][j-1]!=1){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}}return dp[obstacleGrid.size()][obstacleGrid[0].size()];}
};

LCR 166.珠宝的最高价值

LCR 166. 珠宝的最高价值

        现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:

  • 只能从架子的左上角开始拿珠宝
  • 每次可以移动到右侧或下侧的相邻位置
  • 到达珠宝架子的右下角时,停止拿取

注意:珠宝的价值都是大于 0 的。除非这个架子上没有任何珠宝,比如 frame = [[0]]。

示例 1:

输入: frame = [[1,3,1],[1,5,1],[4,2,1]]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最高价值的珠宝

提示:

  • 0 < frame.length <= 200
  • 0 < frame[0].length <= 200

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。因此写出状态表示:dp[i][j]表示:到达[i,j]位置时,此时的最大值。

2、状态转移方程:根据题意,我们可知只能向左或者向右移动即:

每次移动都会拿珠宝,因此写出状态转移方程:

3、初始化(重点):我们多加上一横以及一列让初始化更简单,也是防止越界。根据题意,我们可以发现:要使dp表正确,我们仅需将dp[0][j]、dp[i][0]初始化为0即可,如下图示:

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

因此我们写出如下题解:

class Solution {
public:int jewelleryValue(vector<vector<int>>& frame) {int n=frame.size();int m=frame[0].size();vector<vector<int>> dp(n+1,vector<int>(m+1));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1])+frame[i-1][j-1];}}return dp[n][m];}
};

931.下降路径最小和

931. 下降路径最小和

        给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 最小和

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1:

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100


解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。状态表示为:dp[i][j]表示: 到达[i,j]位置是,最小的下降路径。

2、状态转移方程:dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+matrix[i-1][j-1];如何d得出来的呢?我们可以从[i-1,j-1]->[i,j] [i-1,j]->[i,j] [i-1,j+1]->[i,j] 可以得出如下:

3、初始化(重点):根据题意,我们可以发现:要使dp表正确,我们需要多加一横以及两列,并且将最左的以及最右的两列初始化为最大,第一横初始化为0。(简化操作:现将全部初始化最大,第一横初始化为0)如下图所示:

4、填表顺序:从上往下

5、返回值:最后一横的最小值。

因此我们写出如下题解:

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int n=matrix.size(),m=matrix[0].size();vector<vector<int>> dp(n+1,vector<int>(m+2,INT_MAX));for(int i=0;i<m+2;i++){dp[0][i]=0;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+matrix[i-1][j-1];}}int min=INT_MAX;for(int j=1;j<=m;j++){if(min>dp[n][j])min=dp[n][j];}return min;}
};

64.最小路径和

64. 最小路径和

        给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。dp[i][j] 表示:达到[i,j]位置,最小路径和。

2、状态转移方程: dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i-1][j-1];

3、初始化(重点):多加一横以及一列,我们需要保证里面的值要保证后面的值是正确的。因此我们将所有值都先初始化为最大值,再将dp[0][1]或者dp[1][0]初始化为0即可。后续也需要注意下标的映射关系。

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

因此我们写出如下题解:

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<int>> dp(n+1,vector<int>(m+1,INT_MAX));dp[0][1]=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i-1][j-1];}}return dp[n][m];}
};

 


                      感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

在Node.js中如何实现用户身份验证和授权

当涉及到构建安全的应用程序时&#xff0c;用户身份验证和授权是至关重要的一环。在Node.js中&#xff0c;我们可以利用一些流行的库和技术来实现这些功能&#xff0c;确保我们的应用程序具有所需的安全性。本篇博客将介绍如何在Node.js中实现用户身份验证和授权。 用户身份验…

《真象还原》读书笔记——第八章 内存管理系统(字符串操作、位图定义与实现)

8.1 makefile 8.2 实现 assert 断言 8.2.1 实现开、关中断的函数 kernel/interrupt.c 补充了获取中断状态和设置中断的函数 #include "io.h" #include "interrupt.h" #include "stdint.h" #include "global.h" #include "prin…

Navicat Premium创建MySQL存储过程

1、点击“函数”&#xff0c;新建函数&#xff1b; 2、选择“过程”&#xff0c;输入存储过程名称&#xff0c;点击完成即可&#xff0c;可以跳过参数的设置&#xff1b; 3、编写存储过程的代码&#xff0c;保存&#xff1b; CREATE DEFINERrootlocalhost PROCEDURE insertuser…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

​LeetCode解法汇总2673. 使二叉树所有路径值相等的最小代价

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个整数 n 表示一棵 满二叉树 里面节…

抖音作品评论id提取工具|视频内容提取软件

抖音视频提取便捷高效&#xff0c;抖音作品评论id提取工具助您快速获取数据 针对抖音作品评论id提取的需求&#xff0c;我们推出了一款功能强大的工具&#xff0c;旨在帮助用户快速提取抖音作品的评论id。无论您是进行数据分析、社交媒体研究还是其他用途&#xff0c;我们的工…

Linux------进程地址空间

目录 一、进程地址空间 二、地址空间本质 三、什么是区域划分 四、为什么要有地址空间 1.让进程以统一的视角看到内存 2.进程访问内存的安全检查 3.将进程管理与内存管理进行解耦 一、进程地址空间 在我们学习C/C的时候&#xff0c;一定经常听到数据存放在堆区、栈区、…

java多线程并发实战,java高并发场景面试题

阶段一&#xff1a;筑基 Java基础掌握不牢&#xff0c;对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基础开始&#xff1b;在面试的时候&#xff0c;面试官无疑不是从基础开始拷问。 内容包括&#xff1a;Java概述、Java基本语法、Java 执行控制流程、…

代码随想录算法训练营第26天—回溯算法06 | ● *332.重新安排行程 ● *51. N皇后 ● *37. 解数独 ● 总结

*332.重新安排行程 https://programmercarl.com/0332.%E9%87%8D%E6%96%B0%E5%AE%89%E6%8E%92%E8%A1%8C%E7%A8%8B.html 考点 图论里的深度优先搜索&#xff08;本题使用回溯来解决&#xff09;这是一道hard题&#xff0c;一刷先放过去&#xff0c;二刷有精力再做 我的思路 无思…

Hybird App开发,纯血鸿蒙系统快速兼容救星

2024年1月18日的开发者&#xff08;HDC&#xff09;大会上&#xff0c;就官宣了“纯血鸿蒙”操作系统即将于2024年3季度正式投产。与此同时&#xff0c;支付宝、京东、小红书、微博、高德地图、中国移动等在内的超百个头部应用都启动了鸿蒙原生应用开发&#xff0c;鸿蒙开发者日…

多域名ov ssl证书1200元

SSL证书是一种特殊的数字证书产品&#xff0c;它是维护互联网信息安全的重要手段之一&#xff0c;部署到服务器之后可以保护网站信息传输安全。因此&#xff0c;随着互联网的发展&#xff0c;SSL证书也随之越来越受到众多开发者的重视。SSL证书的数字证书产品多种多样&#xff…

手写mybatis插件之分页查询

yml文件 server:port: 8081mybatis:mapper-locations: classpath:mapper/*.xmlconfig-location: classpath:mybatis-config.xmlspring:datasource:password: 1234username: rootdriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?useUnicod…

react-组件基础

1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…

4G工牌室内外定位系统

4G工牌室内外定位系统是一种高效、精准的定位技术&#xff0c;它利用4G通信网络和GPS卫星定位系统&#xff0c;实现了对人员和物品的实时跟踪和定位。该系统广泛应用于企业管理、安全监控、智能交通等领域&#xff0c;为企业提供了更加高效、便捷的管理方式。 在室内环境中&am…

链表(C语言版)超详细讲解

链表 链表基础 一、链表的概念 定义&#xff1a; 链表是一种物理存储上非连续&#xff0c;数据元素的逻辑顺序通过链表中的指针链接次序&#xff0c;实现的一种线性存储结构。二、链表的构成 构成&#xff1a;链表由一个个结点组成&#xff0c;每个结点包含两个部分&#xff1…

全网最详细的Jmeter接口自动化测试

前面我们复习了jmeter 的非图形化界面运行我们的测试接口。 大家可以翻看往期jmeter的文章。 具体来说就是&#xff1a;jmeter -n -t ****.jmx -l ****.jtl -e -o **** (*号代表路径&#xff09; 生成了测试报告。 但是这个非图形化运行有个缺点&#xff0c;就是只能运…

蓝牙资产标签信标

随着科技的不断进步&#xff0c;蓝牙技术的应用已经深入到我们的日常生活中。其中&#xff0c;蓝牙资产标签作为一种新型的资产管理方式&#xff0c;正逐渐受到广泛欢迎。蓝牙资产标签是一种基于蓝牙技术的小型电子标签&#xff0c;可以粘贴在各种资产上&#xff0c;通过手机或…

代码随想录算法训练营第27天—贪心算法01 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

理论基础 https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 贪心算法的本质&#xff1a;由局部最优推到全局最优贪心算法的套路&#xff1a;无固定套路 455.分发饼干 https://programmercarl.com/0455.%E5%88%8…

(白盒测试)简单循环测试

简单循环测试 1.为什么要引入简单循环测试&#xff1f; 用来测试代码中的循环结构是否能正常执行 是否会少执行一次&#xff1f;多执行一次&#xff1f; 通过循环测试就可以得知 2.什么是简单循环&#xff1f; 没有嵌套的循环⇒简单循环 比如 单层的for循环 单层的while循…

【Qt】鼠标拖拽修改控件尺寸---八个方位修改

前提 在开发一个类似qdesiger的项目中 使用QGraphicsProxyWidget将Qt基础控件作为item放在场景视图中显示和编辑 创建自定义类继承QGraphicsProxyWidget&#xff0c;管理控件 成员变量 有控件的xywh等&#xff0c;其中x、y坐标存储是基于最底层widgetitem的 坐标系 x轴以右为正…