「动态规划」地下城游戏

力扣原题链接,点击跳转。

有一个地下城,我们用m×n大小的二维数组dungeon表示。dungeon[i][j]如果为正,该位置有血包,可以加血量;如果为负,该位置有恶魔,会扣掉相应的血量。有一个骑士在左上角,有一个公主在右下角。骑士为了尽快解救公主,决定每次只往下走一步,或者往右走一步。他的血量降到0或者负数,就会立刻死亡。任何房间都可能对骑士的血量造成威胁,也可能增加骑士的血量,包括骑士进入的左上角房间以及公主被监禁的右下角房间。请问骑士的初始血量至少是多少,才能解救公主呢?

我们用动态规划的思想来解决这个问题。创建dp表,首先确定状态表示:究竟应该用dp[i][j]表示从左上角到达(i,j)的初始血量至少是多少,还是表示从(i,j)到达右下角的初始血量至少是多少呢?如果是前者,是推不出状态转移方程的,这是因为右下方的恶魔有可能对血量造成威胁,但是(i,j)最近的一步是(i-1,j)和(i,j-1),无法把右下方的影响考虑在内。故而,我们采取后一种状态表示。

在到达(i,j)后,下一步可能前往(i+1,j)或(i,j+1)。如果前往(i+1,j),应满足dp[i][j]+dungeon[i][j]=dp[i+1][j];同理,如果前往(i,j+1),应满足dp[i][j]+dungeon[i][j]=dp[i][j+1]。然而,我们要让dp[i][j]尽可能小,所以选择能让dp[i][j]更小的路径,即dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]。这里还需要考虑一个问题,如果dungeon[i][j]是一个很大的血包,使得dp[i][j]≤0,那么就要把dp[i][j]设置成1,因为血量必须为正数。故状态转移方程为:dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-dungeon[i][j])。

接着考虑初始化的问题。由于dp[i][j]只和右边和下边的值相关,所以应初始化最下边一行和最右边一列,防止越界。

        ??
? ? ? ? ?

我们用一种更加优雅的方式来初始化,在最下边和最右边添加一行一列。

        ? *? *
? ? ? ? ? *
* * * * * *

考虑右下角那个?的值,我们可以理解为:到达这个?后,向下走和向右走,都至少需要1点血量,那么这个?下边和右边的位置应初始化为1。当然,你也可以带入状态转移方程,只有这么初始化才是合理的。

        ? *? *
? ? ? ? ? 1
* * * * 1 *

接着考虑其他?位置。为了在求min(dp[i+1][j],dp[i][j+1])时,*位置的值不影响结果,最好把*位置的值都初始化为+∞。由于dp表每个位置的值只和右边和下边的值相关,故应从下往上填每一行,每一行从右往左填表。最后,应返回dp[0][0]的值。

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

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

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

相关文章

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中&#xff0c;科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型&#xff0c;仿佛穿越时空&#xff0c;来到了一个充满奇幻色彩的科技世界。在这里&#xff0c;高楼大厦鳞次栉比&#xff0c;绿色植被点缀其间&am…

【文末附gpt升级方案】革新多模态学习:哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究

革新多模态学习&#xff1a;哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究 摘要&#xff1a;随着人工智能技术的飞速发展&#xff0c;多模态学习已成为机器学习领域的重要研究方向。然而&#xff0c;传统的多模态学习方法往往存在信息融合困难、模型复杂度高等问题…

深度学习模型keras第二十三讲:在KerasCV中使用SAM进行任何图像分割

1 SAM概念 ###1.1 SAM定义 Segment Anything Model&#xff08;SAM&#xff09;是一种基于深度学习的图像分割模型&#xff0c;其主要特点包括&#xff1a; 高质量的图像分割&#xff1a;SAM可以从输入提示&#xff08;如点、框、文字等&#xff09;生成高质量的对象掩模&am…

我爱我家:租赁下位替代买房,能行吗?

我爱我家&#xff0c;凭什么五天四板&#xff1f; 上周五的楼市组合拳出台后&#xff0c;地产板块迎来高潮。 这其中最火的不是我们常说的“招宝万金”&#xff0c;而是——我爱我家。 五天四板&#xff0c;一个月不到&#xff0c;股价轻松翻翻。 公司有什么变化吗&#xff1…

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 什么是弹性布局&#xff08;Flex&#xff09;&#xff1f; 弹性布局&#xff08;Flex&#xff09;是一种基于弹性盒子模型的布局方式&#xff0c;类…

C语言例题46、根据公式π/4=1-1/3+1/5-1/7+1/9-1/11+…,计算π的近似值,当最后一项的绝对值小于0.000001为止

#include <stdio.h> #include <math.h>int main() {int fm 1;//分母double sign 1;//正负号double fzs 1;//分子式double sum 0;while (fabs(fzs) > 0.000001) {sum fzs;sign * -1; //变换正负号fm 2; //分母3、5、7、9...增长fzs sign / fm;//分子式…

算法思想汇总

95% 的算法都是基于这 6 种算法思想 - 知乎 一文图解弄懂八大常用算法思想&#xff01; - 掘金 八种常用算法思想 | 智能后端和架构 【总结】递归、回溯、深度优先、广度优先_递归算法与深度优先算法-CSDN博客 https://www.cnblogs.com/cdaniu/p/16369446.html

9.6 Go语言入门(数组、切片和指针)

Go语言入门&#xff08;数组、切片和指针&#xff09; 目录五、数组、切片和指针1. 数组1.1 声明和初始化数组1.2 访问和修改数组元素1.3 多维数组 2. 切片2.1 声明和初始化切片2.2 访问和修改切片元素2.3 切片操作2.4 切片的追加和拷贝 3. 指针3.1 声明和初始化指针3.2 指针与…

【资料分享】你敢相信这些高大上的BI仪表盘都是用EXCEL做出来的?!

引言 现在大家都知道数据可视化、数据看板&#xff0c;几乎每个公司部门都有仪表盘的需求。 近年来&#xff0c;学习可视化软件的人也越来越多&#xff0c;国外Tableau、PowerBI就是这一领域的领先者&#xff0c;而国内也有不少厂家在研发数据可视化软件&#xff0c;比如帆软…

【前端每日基础】day18——css清除浮动

在CSS中&#xff0c;浮动&#xff08;float&#xff09;是一种常见的布局技术&#xff0c;但它常常导致父容器的高度无法自动扩展以包含浮动的子元素。这时就需要清除浮动。以下是几种常用的清除浮动的方法&#xff1a; 使用清除元素&#xff08;Clearfix&#xff09; Clearfi…

如何用java做一个模拟登录画面

要求&#xff1a; 实现registerAction方法中的注册逻辑。实现login方法中的登录逻辑&#xff0c;确保只有当用户名和密码都正确时才返回true。实现好友管理功能&#xff0c;包括添加好友、删除好友、查看好友列表。确保所有的文件操作&#xff08;如读取和写入credentials.txt…

Pytorch深度学习实践笔记4

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

INES文件头解析

ines_header.h #pragma once/* ** NES ROM 标头信息格式 ** FlameCyclone ** 2024.5.11 ** (https://gitee.com/flame_cyclone/ines-info.git) */#include <stdint.h> #include <string.h>// INES ROM 标头 // https://www.nesdev.org/wiki/INES typedef struct _…

信息化项目交付验收流程管理办法

项目交付验收流程制度 管理办法 (执行版) (文件编号: ) 编制: 审核: 批准: 版本: 生效日期: 管理办法概述 制定目的为了保证公司在建项目交付验收工作事项的顺利开展,保证交付验收进度及…

POJ 1463 Strategic game/洛谷UVA1292(树形dp)

P O J 1463 S t r a t e g i c g a m e \Huge{POJ\ 1463\ Strategic game} POJ 1463 Strategicgame 文章目录 题意思路标程 题目地址1&#xff1a;1463 – Strategic game (poj.org) 题目地址2&#xff1a;Strategic game - 洛谷 题目地址3&#xff1a;P2016 战略游戏 - 洛谷 …

创新力作 焕新首发丨捷顺科技·捷曜系列智慧停车新品全新上市

2024捷顺科技智慧停车全家族新品全面上市 全新外观、全新特性、全新体验 新控制机、新道闸、新超眸相机... 每款新品都有哪些功能亮点 带您一探究竟

解决vue3 vite打包报Root file specified for compilation问题

解决方法&#xff1a; 修改package.json打包命令 把 "build": "vue-tsc --noEmit && vite build" 修改为 "build": "vite build" 就可以了 另外关于allowJs这个问题&#xff0c;在tsconfig.json文件中配置"allowJs&qu…

C++入门:从C语言到C++的过渡(1)

目录 1.什么是C 2.C的标准库 3.命名空间 3.1为什么要存在命名空间 3.2命名空间的定义 3.3命名空间的使用 3.3.1域作用限定符 3.3.2using关键字引入某个成员 3.3.3using关键字引入命名空间名称 3.4命名空间的嵌套 3.5命名空间的合并 4.C中的输入与输出 1.什么是C C&am…

mysql binlog统一恢复误删数据库、表、数据(没有任何备份)

先将mysql文件夹中的my.ini进行设置 在 [mysqld]下边加上 # mysql-bin 是日志的基本名或前缀名&#xff0c;最后生成的日志文件是mysql-bin.000001类似&#xff0c;重启mysql数字会递增 log_binmysql-bin #binlog格式&#xff0c;statement&#xff0c;row&#xff0c;mixed可…