蓝桥杯刷题_day7_动态规划_路径问题

文章目录

  • DAY7
    • 下降路径最小和
    • 最小路径和
    • 地下城游戏

DAY7

下降路径最小和

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

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

【输入样例】

matrix = [[2,1,3],[6,5,4],[7,8,9]]

【输出样例】

13

【数据规模与约定】

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

【解题思路】

【C++程序代码】

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

最小路径和

【题目描述】
给定一个包含非负整数的 _m_ x _n_ 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

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

【输入样例】

grid = [[1,3,1],[1,5,1],[4,2,1]]

【输出样例】

7

【数据规模与约定】

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

【解题思路】
通过题目得出dp[i]表示的是走到当前位置时的最小路径和。由因为题目要求只能向下或者向右走一步,所以dp[i]应该是上面的格子或者右边的格子其中小的那个加上当前位置的值。

【C++程序代码】

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

地下城游戏

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

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

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

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

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

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

【输入样例】

dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]]


【输出样例】

7

【数据规模与约定】

  • m == dungeon.length
  • n == dungeon[i].length
  • 1 <= m, n <= 200
  • -1000 <= dungeon[i][j] <= 1000

【解题思路】
这个问题是一个典型的动态规划问题。我们需要找到英勇骑士拯救公主时所需的最低初始健康点数。为了解决这个问题,我们可以从终点开始(即公主所在的右下角),逆向思考骑士到达每个房间所需的最低健康点数。这样,我们可以确保骑士在任何时刻的健康点数都不会低于1。

  1. 动态规划状态定义
    我们定义 dp[i][j] 为从点 (i, j) 到达终点所需的最低健康点数。因此,dp[0][0] 就是我们要找的答案。

  2. 边界条件

    1. dp[m-1][n-1]:这是公主所在的房间,骑士至少需要1点健康,如果这个房间的值为正,则骑士只需要1点健康即可;如果为负,则骑士需要足够的健康点数以确保他在离开这个房间时至少有1点健康。因此,dp[m-1][n-1] = max(1, 1 - dungeon[m-1][n-1])
    2. 边界的其他点:对于最下面一行(row)和最右边一列(col),骑士只能向右或者向下移动,因此每个点的 dp 值依赖于它右边或者下面的点的 dp 值。
  3. 状态转移方程
    对于非边界点 (i, j),骑士可以从 (i+1, j)(下方)或 (i, j+1)(右方)到达 (i, j)。因此,dp[i][j] 依赖于 dp[i+1][j]dp[i][j+1]。骑士在 (i, j) 点的健康点数必须足以让他能够到达 (i+1, j) 或 (i, j+1),同时保持至少1点健康。因此,状态转移方程为:
    dp[i][j] = max(1, min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j])
    这里 max(1, x) 确保了在任何时刻骑士的健康点数至少为1。

  4. 计算顺序
    由于我们从终点开始反向计算,所以我们应该从右下角开始,首先计算最后一行和最后一列,然后向左上方移动,直到计算到 dp[0][0]

  5. 实现细节

    1. 初始化 dp 数组,除了 dp[row-1][col-1] 之外,其他所有 dp[row][col] 均设为 INT_MAX。
    2. 从右下角开始逆向遍历,计算每个 dp[i][j]
    3. 返回 dp[0][0] 作为结果。

【C++程序代码】

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

代码详解

在这段代码中,我们初始化了一个 (row + 1) x (col + 1) 大小的 dp 数组,并将除 dp[row][col - 1] 和 dp[row - 1][col] 外的所有元素设置为 INT_MAX,这样做是为了确保在逆向计算过程中,我们不会用到这些未初始化的状态值。
然后我们从 dp[row - 1][col - 1] (即公主所在的房间)开始向左上方逆向遍历,对每一个格子 (i, j),计算所需的最小初始健康点数。这个数值是根据它的右边 (i, j+1) 和下边 (i+1, j) 的两个格子的 dp 值来得到的。我们取这两个 dp 值中较小的一个,然后减去当前格子的 dungeon[i][j] 值(如果当前格子是恶魔,dungeon[i][j] 将是负数;如果是魔法球或空房间,dungeon[i][j] 将是非负数),以此来计算骑士在进入格子 (i, j) 前,所需的最小健康点数。最后,我们需要确保这个数值至少为1,因为骑士的健康点数不能少于1。
最终,dp[0][0] 就是我们要找的答案,即骑士从左上角出发所需的最小初始健康点数。

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

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

相关文章

FreeRTOS_day2:2024/4/1

1.总结串口的发送和接收功能使用到的函数(见思维导图) 2.总结DMA的作用&#xff0c;和DMA空闲中断的使用方式(见思维导图) 3.使用PWMADC光敏电阻完成光控灯的实验 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration------------------------…

CentOS7安装DockerCompose

1.CentOS7安装DockerCompose 1.1.下载 Linux下需要通过命令下载&#xff1a; # 安装 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose1.2.修改文件权限 修改文件权限&#xff1a…

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗 Mac玩游戏 crossover24免费激活

CrossOver是一款可以在macOS上运行Windows应用程序的软件&#xff0c;它利用了Wine技术&#xff0c;无需安装虚拟机或双系统&#xff0c;可以直接在苹果系统下运行Windows游戏。那么&#xff0c;使用CrossOver玩游戏会损害电脑吗&#xff1f;CrossOver玩游戏会卡吗&#xff1f;…

校园招聘管理系统(源码+文档)

校园招聘管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端热门岗位校园招聘首页个人简历添加个人简历我的界面注册界面查看个人简历界面个人资料界面登录界面消息界面退出登录 管理端登录界面![请添加图片描述](htt…

vite vue3 import.meta.glob动态路由

在Vite中使用Vue 3&#xff0c;你可以使用import.meta.glob来导入目录下的多个Vue组件&#xff0c;并自动生成路由。以下是一个简单的例子&#xff1a; router/index.js // router/index.js import { createRouter, createWebHistory } from vue-router;// 自动导入views目录下…

性能测试必备docker环境准备

在当今快速发展的软件开发领域&#xff0c;docker作为一种开源的容器化技术&#xff0c;已经成为提高应用部署效率、实现快速、一致的环境配置的重要工具。而性能测试&#xff0c;则是确保软件应用在各种负载和压力条件下表现良好的关键步骤。二者的结合&#xff0c;为软件开发…

35岁的前阿里员工:薪资从46K降到40K进传统企业,太香了,8.30上班,5点下班

互联网大厂&#xff0c;对每一位程序员而言都是一个向往的地方。高薪、高压、高目标&#xff0c;每个人都为之奋斗不止。然而&#xff0c;在光鲜亮丽的外表之下&#xff0c;却隐藏着无数的焦虑与疲惫。 35岁&#xff0c;对于一个程序员来说&#xff0c;似乎是一个被现实无情提…

Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE

前面几篇文章讲了那么多似乎和Docker无关的实战操作&#xff0c;本篇总算开始说到Docker了。 1、关于Docker 1.1、什么是Docker Docker概念就是大概了解一下就可以&#xff0c;还是引用一下百度百科吧&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以…

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…

机器学习在智能音箱中的应用探索与实践:让声音更懂你

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Android ImageView以及实现截图

实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…

Android开发 OCR:通过Tesseract实现图片文字识别

下面是整个详解步骤过程 效果图一、OCR的含义二、什么是Tesseract三、前提准备1、添加依赖2、数据文件下载路径 四、实际代码案例Demo如下&#xff1a;Main.xmlMain.java 效果图 流程&#xff1a;获取assets中的图片显示到页面&#xff0c;提取照片内的文字 一、OCR的含义 o…

单一职责原则

1.1 阅读干吗不直接用手机&#xff1f; 电子阅读器比较专注&#xff0c;而手机功能比较多&#xff0c;影响专注。 1.2 手机不纯粹 手机确实很方便。但是现在的手机就是一台小型智能电脑。它不仅能打电话&#xff0c;还能听音乐、看电影电视、与个人交流、与一群人群聊&#…

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下&#xff0c;我们需要从别的系统获取数据时&#xff0c;一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼&#xff0c;旨在总结相关套路&#xff0c;提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

Prometheus +Grafana +node_exporter可视化监控Linux + windows虚机

1、介绍 背景&#xff1a;需要对多台虚机进行负载可视乎监控&#xff0c;并进行及时的报警 2、架构图 node_exporter &#xff1a;主要是负责采集服务器的信息。 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 Grafana &#xff1a; 主要是…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件&#xff0c;用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0c;从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步&#xff1a;创建测试计划 在JMet…

5.6 物联网RK3399项目开发实录-Android开发之U-Boot 编译及使用(wulianjishu666)

物联网入门到项目实干案例下载&#xff1a; https://pan.baidu.com/s/1fHRxXBqRKTPvXKFOQsP80Q?pwdh5ug --------------------------------------------------------------------------------------------------------------------------------- U-Boot 使用 前言 RK U-B…

首个基于SSM-Transformer混合架构,开源商业大模型Jamba

3月29日&#xff0c;知名AI研究实验室AI21在官网开源了&#xff0c;首个基于SSM-Transformer混合架构的商业大模型——Jamba。 目前&#xff0c;ChatGPT、Stable Difusion 、Lyria等产品使用的皆是Transformer架构&#xff0c;虽然在捕捉序列内长距离依赖关系、泛化能力、特征…

【数据结构】新篇章 -- 顺序表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…