动态规划专训2——路径问题

1.不同路径

62. 不同路径

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

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

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

因为题给信息,一维数组已经完成不了要求,所以我们要用二维数组

1.状态表示:用dp[ i ][ j ]表示以第 i 行 j 列为结尾的路径总和

2.状态转移方程:dp[ i ][ j ] = dp[ i - 1][ j ] + dp[ i ][ j - 1 ]

3.初始化:dp[0][1] = 1

4.填表顺序:从上往下填每一行,从左往右填每一列

5.返回值:dp[m][n]

class Solution {
public:int uniquePaths(int m, int n) {//1. 创建 dp 表//2. 初始化//3. 填表//4. 返回值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];}
};

这是ac代码

2.不同路径II

63. 不同路径 II

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

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

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

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

1.状态表示:用dp[ i ][ j ]表示以第 i 行 j 列为结尾的路径总和

2.状态转移方程:dp[ i ][ j ] = dp[ i - 1][ j ] + dp[ i ][ j - 1 ]

3.初始化:dp[0][1] = 1

4.填表顺序:从上往下填每一行,从左往右填每一列

5.返回值:dp[m][n]

这题与前面的题相似,要注意当位置为障碍物时,dp[ i ][ j ] 的值应该为0

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();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){if(obstacleGrid[i - 1][j - 1])dp[i][j] = 0;elsedp[i][j] = dp[i - 1][j] + dp[i][j - 1];}return dp[m][n];}
};

这是ac代码

3.珠宝的最大价值

LCR 166. 珠宝的最高价值

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

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

1.状态表示:用dp[ i ][ j ]表示以第 i 行 j 列为结尾的最大礼物价值

2.状态转移方程:dp[ i ][ j ] = max( dp[ i - 1][ j ], dp[ i ][ j - 1 ] ) + p[ i ][ j ]

3.初始化

4.填表顺序:从上往下填每一行,从左往右填每一列

5.返回值:dp[m][n]

注意:开vector时每行每列多开一行列,所以找对应p时要注意下标映射关系

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

这是ac代码

4.下降路径最小和

931. 下降路径最小和

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

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

1.状态表示:用dp[ i ][ j ]表示以第 i 行 j 列为结尾的下降路径最小和

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

3.初始化 第一行全为0, 其他全为INT_MAX

4.填表顺序:从上往下填每一行,从左往右填每一列

5.返回值:最后一行的最小值

注意: 下标的映射关系,开数组的大小,返回值的判断

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

这是ac代码

5.最小路径和

64. 最小路径和

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

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

1.状态表示:用dp[ i ][ j ]表示以第 i 行 j 列为结尾的路径最小和

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

3.初始化 dp[0][1] = 0, 其他全为INT_MAX

4.填表顺序:从上往下填每一行,从左往右填每一列

5.返回值:dp[m][n]

注意:下标的映射关系,数组的初始化

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

这是ac代码

6.地下城游戏

174. 地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快解救公主,骑士决定每次只 向右 或 向下 移动一步。

返回确保骑士能够拯救到公主所需的最低初始健康点数。

注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间

1.状态表示:用dp[ i ][ j ]表示以第 i 行 j 列为开始的所需最小生命值

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

3.初始化 dp[m][n - 1] = 0, 其他全为INT_MAX

4.填表顺序:从下往上填每一行,从右往左填每一列

5.返回值:dp[0][0]

注意:初始化和填表顺序,状态转移方程,当dp[ i ][ j ] < 1时,下一个血包很大,导致当前需要可能小于1,我们要对1取max,保证情况的正确性

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

这是ac代码

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!

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

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

相关文章

三小时使用鸿蒙OS模仿羊了个羊,附源码

学习鸿蒙arkTS语言&#xff0c;决定直接通过实践的方式上手&#xff0c;而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路&#xff0c;准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题&#xff0c;再去查看相应的文档。 首先需要准备卡片对应的图片…

【STL】顺序容器与容器适配器

文章目录 1顺序容器概述1.1array1.2forward_list1.3deque 2.如何确定使用哪种顺序容器呢&#xff1f;3.容器适配器的概念4.如何定义适配器呢&#xff1f; 1顺序容器概述 给出以下顺序容器表&#xff1a; 顺序容器类型作用vector可变大小的数组&#xff0c;支持快速访问&#…

lua学习笔记15(元表的学习)

print("*****************************元表的学习*******************************") print("*****************************元表的概念*******************************") --任何变量都可以作为另一个表变量的元表 --任何表变量都可以有自己的元表 --当我…

谷歌浏览器变黑色背景 扩展程序 Hacker Vision

这个扩展程序能够把浏览器的背景变成黑色&#xff0c;长时间阅读文章的时候护眼效果很不错 效果如下

《前端面试题》- JS基础 - call()、apply()、bind() 的区别

call 、bind 、 apply 这三个函数的功能都是改变this的指向问题&#xff0c;但是也存在一定的区别。 call 的参数是直接放进去的&#xff0c;第二第三第 n 个参数全都用逗号分隔,apply 的所有参数都必须放在一个数组里面传进去bind 除了返回是函数以外&#xff0c;它 的参数和…

美团一面:说说synchronized的实现原理?问麻了。。。。

引言 在现代软件开发领域&#xff0c;多线程并发编程已经成为提高系统性能、提升用户体验的重要手段。然而&#xff0c;多线程环境下的数据同步与资源共享问题也随之而来&#xff0c;处理不当可能导致数据不一致、死锁等各种并发问题。为此&#xff0c;Java语言提供了一种内置…

HwBinder流程分析

HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用&#xff0c;后者是给一般的应用程序使用&#xff0c;为了不影响现有的binder&#xff0c;单独增加硬件的HwBinder来实现硬件相关进程的通信。 HwBinder也是有四部分组成&#xff1a;hwservermanager、server、client…

PUBG绝地求生29.1版本延迟高/卡顿/掉帧/丢包的快速解决方法

要想在绝地求生中获得好成绩&#xff0c;咱们需求把握一些根本的游戏技巧。比方&#xff0c;在挑选降落点时&#xff0c;咱们可以运用u标签来着重“安全”二字。挑选一个相对较为安全的降落点可以防止与其他玩家过早触摸&#xff0c;给自己争夺更多时间来搜集资源和配备。接下来…

ORAN C平面 Section Extension 22

ORAN C平面Section扩展22用于ACK/NACK请求。除section type 7外&#xff0c;section扩展22可以用于从O-DU发送到O-RU的所有section type和section扩展。 对于一个section描述&#xff0c;O-DU可以使用section扩展22要求O-RU使用section type 8 C平面消息进行ACK/NACK反馈。关于…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)

文章目录 流mtvecmepcmcausemtvalmstatustrap 初始化trap的top half&#xff08;硬件完成&#xff09;trap的bottom half&#xff08;软件完成&#xff09;从trap返回代码实现 流 控制流&#xff1a;程序控制的执行流 trap分为中断和异常 mtvec base&#xff1a;存储trap入…

2_8.Linux系统引导过程及引导修复

# 1.磁盘引导 # mbr主引导记录0磁道1扇区446 作用&#xff1a; 记录grub2引导文件的位置 当mbr数据丢失系统会因为找不到启动分区而停止启动 问题模拟方式: 系统磁盘/dev/sda dd if/dev/zero of/dev/vda bs446 count1 ##清空系统/dev/sda上的mbr数据 恢复方式&#xff1a; &…

PyTorch深度学习——线性回归、计算图和自动求导机制、损失函数和优化器

一、线性回归 线性回归模型是输入一个特征的张量&#xff0c;做线性变换&#xff0c;输出一个预测张量 为了构造线性变换&#xff0c;需要知道输入特征维度大小&#xff0c;并且知道线性回归的权重和偏置&#xff0c;在forward方法中&#xff0c;输入一个特征张量x&#xff0…

LeetCode -- 第 392 场周赛

链接 : 竞赛 - 力扣 (LeetCode) 3105. 最长的严格递增或递减子数组 . - 力扣&#xff08;LeetCode&#xff09; 用两个分组循环(本质就是双指针)&#xff0c;分别求出最长的递增和递减子数组的长度&#xff0c;然后取max ; class Solution { public:int longestMonotonicS…

客户现场服务器故障处理建议携带的设备

WIFI路由器&#xff0c;带 SIM卡的&#xff0c;带多个千兆网口的&#xff0c;网线 USB硬盘&#xff08;TB计算&#xff09; U盘启动盘 便携的KVM&#xff08;另外带 键盘/鼠标/VGA线&#xff0c;方便现场多个服务器切换显示和控制&#xff09; USB Hub&#xff08;万一客户服…

图形化界面使用MQ!!!

一、docker安装 1、拉去镜像 docker pull rabbitmq:3.10-management 2、Docker运行&#xff0c;并设置开机自启动&#xff08;第一个-p是MQ默认配置的端口&#xff0c;第二个-p是图形化界面配置的端口&#xff09; docker run -d --restartalways --name rabbitmq -p 5672:5672…

直播系统的短视频直播源码,带有多功能后台系统的直播短视频平台 APP 源码。

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 此源码是一个直播系统&#xff0c;集直播、短视频等功能&#xff0c;根据市场趋势开发并推出思乐直播APP&#xff0c;APP功能丰富且可在后台管理系统进行配置&#xff0c;做到按需求来…

《QT实用小工具·二十二》多种样式导航按钮控件

1、概述 源码放在文章末尾 该项目实现了多种样式的导航按钮控件 可设置文字的左侧、右侧、顶部、底部间隔。 可设置文字对齐方式。 可设置显示倒三角、倒三角边长、倒三角位置、倒三角颜色。 可设置显示图标、图标间隔、图标尺寸、正常状态图标、悬停状态图标、选中状态图标…

字节面经之碰上了活菩萨

rt, 楼主碰上了活菩萨. 简单做了个自我介绍, 然后项目没怎么问, 说问我一些计算机基础知识. 然后让我说说我都会什么. 然后从数据结构开始. 让我讲一讲自己熟悉的数据结构, 比如树什么的. 然后我就把二叉树, 二叉搜索树, 二叉平衡树, 红黑树. DFS/BFS还有对应的场景讲了一遍.…

ctfshow web入门 文件上传web162--web167

web162 session文件包含条件竞争 直接包含不传马了 我们上传的文件如果不符合要求&#xff0c;就会被删除&#xff0c;导致成功上传无法访问&#xff0c;没有用。但是如果我们上传的速度比服务器删的速度快&#xff0c;就可以了。 上传.user.ini GIF89a auto_append_file/tmp/…