Java 动态规划 174. 地下城游戏

news2024/11/29 22:53:42

 代码展示:

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        int m=dungeon.length;
        int n=dungeon[0].length;
        //创建dp数组
        int[][]dp=new int[m+1][n+1];
        //初始化
        for(int i=0;i<=m;i++){
            dp[i][n]=Integer.MAX_VALUE;
        }
        for(int j=0;j<=n;j++){
            dp[m][j]=Integer.MAX_VALUE;
        }
        dp[m-1][n]=1;dp[m][n-1]=1;
        //填充数组
        for(int i=m-1;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                dp[i][j]=Math.min(dp[i][j+1],dp[i+1][j])-dungeon[i][j];
                dp[i][j]=Math.max(1,dp[i][j]);
            }
        }
        //返回值
        return dp[0][0];
    }
}

通过动态规划来解决这道题,根据动态规划的5大步骤分析解答

        1.状态表示

                通常来说,我们可以从前到后进行状态表示,也可以从后向前进行状态表示,

                从前到后进行状态表示的话我们可以设dp【i】【j】表示从起点到【i,j】位置时骑士的最小初始健康点

                从后向前进行状态表示的话我们可以设dp【i】【j】表示从【i,j】位置到终点位置骑士最小的初始健康点

                这里我们用第二种方式进行状态表示

        2.状态转移方程

                从最近的一步进行分析,我们要想从【i,j】位置到达终点位置,我们可以向右移动到【i,j+1】的位置,也可以向下移动到【i+1,j】的位置,而我们选择从哪里到终点呢,由于要求骑士的最低健康数,所以我们应该选择到达终点所需最低健康数低的那个位置去终点,而【i,j+1】,【i+1,j】的最低健康数即dp【i,j+1】,dp【i+1,j】,通过比较两个数的大小,选出小的那个位置

                所以状态转移方程应该为:dp[i][j]=Math.min(dp[i][j+1],dp[i+1][j])-dungeon[i][j];

dungeon[i][j]表示当前位置是加血还是扣血,要是加血,那么我们的初始血量就可以减少,要是扣血,那么我们的初始血量就要增加,所以是相反关系

        3.初始化

                为了方便初始化,我们要通过添加辅助结点的方式辅助初始化,在创建dp数组时,相对于dungeon数组,我们要多添加一行一列,这是动态规划常用的方法。

                要注意,填进辅助结点中的值要保证后续填表是正确的,通过分析,在对dp数组进行初始化时我们要将最后一行和最后一列除了 dp[m-1][n]和dp[m][n-1]设为1外,其余的都设为int类型的最大值

        4.填充数组

                由于dp【i,j】依靠dp【i,j+1】,dp【i+1,j】,所以行方向上采用从下往上,列方向上采用从右往左。

        5.返回值

                要知道从【0,0】位置到终点所需的最小健康值,所以返回dp【0】【0】

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

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

相关文章

Linux - 用户|权限管理 - 查看用户组

当我们需要查看 Linux服务器都有哪些用户组的时候, 可以通过如下命令进行查看: cat /etc/group如下图所示: 同时, 还可以通过groupmod三次tab键 进行查看: 具体信息内容解读:

js- 左右两边子数组的和相等

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…

网络编程-day5

IO多路复用--服务器 从中获取返回给指定客户端的信息&#xff08;修改版&#xff09; IO多路复用--客户端

【Distributed】分布式ELK日志文件分析系统(二)

文章目录 一、FilebeatELK 部署1. 环境部署2. 在 Filebeat 节点上操作2.1 安装 Filebeat2.2 设置 filebeat 的主配置文件 3. 在 Apache 节点上操作3.1 在 Logstash 组件所在节点上新建一个 Logstash 配置文件 3. 启动3.1 在Logstash 组件所在节点启动3.2 在 Filebeat 节点 启动…

神仙打架——号称是性能最强的中英文百亿参数量开源模型Baichuan-13B他来了!

下午开个会的功夫看到新闻推送一条最新的大模型相关的项目开源发布了&#xff0c;到底是怎么个事我们来一起看下。 官方项目地址在这里&#xff0c;如下所示&#xff1a; 可以看到&#xff1a;才刚刚过去十几分钟的时间就已经有超过500的star量了。 就在不久前的6月15日&…

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

前言&#xff1a;在最近的后端开发中&#xff0c;多多少少会发现有很多if-else语句&#xff0c;如果条件过多则会造成整体代码看起来非常臃肿&#xff0c;这边我就举一个我在实际开发中的例子&#xff0c;来进行阐述这两种模式在实际开发中我是如何运用的。 目录 一、工厂模式…

Web APls-day05

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; Window对象 BOM BOM(Browser Object Model ) 是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是…

❤️创意网页:猜数字游戏

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【架构设计】高并发架构实战:从需求分析到系统设计

写在前面 很多软件工程师的职业规划是成为架构师&#xff0c;但是要成为架构师很多时候要求先有架构设计经验&#xff0c;而不做架构师又怎么会有架构设计经验呢&#xff1f;那么要如何获得架构设计经验呢&#xff1f; 1 高并发是什么 高并发是指系统在同一时间内处理的请求量…

左神算法中级提升(3)

目录 【案例1】 【题目描述】【2018阿里巴巴面试题】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析1】 【思路解析2】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例5】…

无人机禁飞区地图更新!图新地球全国限飞区自定义地图免费分享!

随着无人机的普及&#xff0c;人们越来越容易拥有一台无人机。但很多用户并不了解无人机的飞行规则和禁飞限制。对于没有严格遵守规定的人来说&#xff0c;无人机飞行往往会构成公共安全和私人财产的潜在危害。 为此&#xff0c;政府和航空管理机构陆续出台了一系列限制无人机…

247个Python练习案例附源码(百看不如一练)

众所周知&#xff0c;我们在学习Pyhont过程中&#xff0c;大都看书枯燥、看视频进度慢&#xff0c;网上查找的学习案例又比较凌乱不成体系。。。 百看不如一练&#xff0c;今天为大家搜集了一份Python从入门到进阶的实战案例合集&#xff0c;共计247个案例&#xff0c;185页内…

【数据仓库】BI看板DataEase入坑指南

开头夸夸国产开源BI软件DataEase&#xff0c;支持常见各种报表&#xff0c;还支持图表联动和上下级钻取&#xff0c;超赞有木有&#xff01;&#xff01;&#xff01; 再来为什么说入坑&#xff0c;源码启动各种不服啊。本地用的maven3.5一直导入不了Java项目backend。后来看了…

【Linux后端服务器开发】缓冲区

目录 一、缓冲区概述 二、语言层面缓冲区 三、C语言模拟实现stdio库 一、缓冲区概述 Linux缓冲区是指在内存中开辟的一块区域&#xff0c;用于存储输入输出数据的临时存储区域。 当应用程序向文件或设备进行读写操作时&#xff0c;数据会先被存储到缓冲区中&#xff0c;然…

MYSQL学习第一天

1.创建数据库&#xff0c;删除数据库&#xff0c;查询创建数据的语句&#xff0c;使用数据库&#xff0c;查询当前默认的数据库以及使用的编码方式校验规则 1.1 创建数据库 create database db_name; 1.2 使用数据库 use db_name; 1.3 查询当前使用的数据库 select datab…

学校公寓管理系统

学校公寓管理系统是学校管理的重要组成部分&#xff0c;它的主要任务是通过数字化和自动化的方式提高公寓管理的效率&#xff0c;同时为学生提供更优质的服务。这个系统能够处理学生住宿的申请、房间的分配、住宿费用的收取以及公寓设施的使用等各项工作。 首先&#xff0c;学校…

【MR设备】燧光MR设备极简教程(使用篇)

燧光MR设备极简教程(使用篇) 一、硬件的基础使用二、定位信标三、投屏直播1、第三人称视角同步MR2、第一人称视角无线投屏相关文章:燧光MR设备极简教程(开发篇) 一、硬件的基础使用 官方使用文档:https://developer.ximmerse.com/#/example?id=6 1. 开机: 长按Home…

漫谈大数据时代的个人信息安全(一)——“按图索骥”

大数据时代的个人信息安全系列——“按图索骥” 一、寻找王珞丹二、啥是Exif &#xff1f;三、个人信息保护小贴士 近日&#xff0c;某高校毕业生在校期间窃取学校内网数据&#xff0c;收集全校学生个人隐私信息的新闻引发了人们对大数据时代个人信息安全问题的再度关注。在大数…

今日教会你录播课实时翻译怎么弄

在数字时代的浪潮中&#xff0c;视频教学是一种重要的教学方式。无论在网络教学平台&#xff0c;还是在大学教育或公司的培训中&#xff0c;录制课程都以其灵活、方便的特点&#xff0c;给广大师生提供了极大的便利。但是&#xff0c;随着国际间交往的不断深入&#xff0c;语言…

【第七章】习题

1、 下列代码创建了几个对象 public class stringPool {public static void main(String[] args) {String s1 new String("abc");String s2 new String("abc");if (s1 s2) {System.out.println("在堆中只创建了一个对象");} else {System.out…