[Leetcode][第174题][JAVA][地下城游戏][DFS][动态规划]

【问题描述】[中等]

在这里插入图片描述

【解答思路】

在这里插入图片描述

1. 回溯(暴力)& 优化

在这里插入图片描述
在这里插入图片描述

超时,需要优化

public int calculateMinimumHP(int[][] dungeon) {if (dungeon == null || dungeon.length == 0 || dungeon[0].length == 0) {return 0;}int rowLen = dungeon.length;int colLen = dungeon[0].length;// 最低的耗血量为 + 1;就是骑士的救公主的最低血量。return dfs(0, 0, rowLen, colLen, dungeon) + 1;
}public int dfs (int rowIndex, int colIndex, int rowSize, int colSize, int[][] dungeon) {//if (rowIndex >= rowSize || colIndex >= colSize) {return Integer.MAX_VALUE;}// 退出条件if (rowIndex == rowSize - 1 && colIndex == colSize - 1) {if (dungeon[rowIndex][colIndex] >= 0) {// 如果最后一个大于等于0,就返还0。return 0;} else {//如果最后一个小于零,就返回负的值。return -dungeon[rowIndex][colIndex];}}
//  右边格子的最优解,也就是最低的耗血量int rightMin = dfs(rowIndex, colIndex + 1, rowSize, colSize, dungeon);
//  下边格子的最优解int downMin = dfs(rowIndex + 1, colIndex, rowSize, colSize, dungeon);// f(i,j) = min(f(i+1, j), f(i, j+1)) - dungeon[i][j]int needMin = Math.min(rightMin, downMin) - dungeon[rowIndex][colIndex];int res = 0;if (needMin < 0) {res =  0;} else {res = needMin;}System.out.println(rowIndex+ " "+colIndex + " "  + res);return res;
}作者:fakerleet
链接:https://leetcode-cn.com/problems/dungeon-game/solution/cong-hui-su-dao-ji-yi-hua-sou-suo-dao-dong-tai-gui/

在这里插入图片描述

private int rowSize = 0;
private int colSize = 0;
private int[][] globalDun = null;
public int calculateMinimumHP(int[][] dungeon) {if (dungeon == null || dungeon.length == 0 || dungeon[0].length == 0) {return 0;}rowSize = dungeon.length;colSize = dungeon[0].length;globalDun = dungeon;int[][] memory = new int[rowSize][colSize];// 初始化为-1,便于区别是否计算过结果了。for (int i = 0; i < rowSize; ++i) {for (int j = 0; j < colSize; ++j) {memory[i][j] = -1;}}return dfs(0, 0, memory) + 1;
}public int dfs (int rowIndex, int colIndex,  int[][] memory) {if (rowIndex >= rowSize || colIndex  >=  colSize) {return Integer.MAX_VALUE;}// 不为-1就是计算过了,直接返回结果。if (memory[rowIndex][colIndex] != -1) {return memory[rowIndex][colIndex];}if (rowIndex == rowSize - 1 && colIndex == colSize - 1) {if (globalDun[rowIndex][colIndex] >= 0) {return 0;} else {return -globalDun[rowIndex][colIndex];}}int right = dfs(rowIndex, colIndex + 1, memory);int down = dfs(rowIndex + 1, colIndex, memory);int needMin = Math.min(right, down) - globalDun[rowIndex][colIndex];int res = 0;if (needMin < 0) {res =  0;} else {res =  needMin;}memory[rowIndex][colIndex] = res;System.out.println(rowIndex+ " "+colIndex + " "  + res);return res;
}作者:fakerleet
链接:https://leetcode-cn.com/problems/dungeon-game/solution/cong-hui-su-dao-ji-yi-hua-sou-suo-dao-dong-tai-gui/
2. 动态规划

思路一:紧接上文
问:深搜过程中的记忆化,真的能保证走过的路径是最优的吗?比如第一次搜索经过[2,2]这个点,把结果记录下来。下次再次搜索的时候,起点可能不一样了,这个时候有没有可能计算结果对[2,2]产生更新呢?
答:dfs的递归本身就是逆推的
第一次搜索[2,2] 看起来是第一次搜索 其实已经是右和下方的回滚了
在这里插入图片描述

public int calculateMinimumHPBest(int[][] dungeon) {if (dungeon == null || dungeon.length == 0 || dungeon[0].length == 0) {return 0;}int rowSize = dungeon.length;int colSize = dungeon[0].length;int[][] dp = new int[rowSize][colSize];// 设置最后一个值。dp[rowSize - 1][colSize -1] = Math.max(0, -dungeon[rowSize - 1][colSize - 1]);// 设置最后一列的值for (int i = rowSize - 2; i >= 0; --i) {int needMin = dp[i + 1][colSize - 1] - dungeon[i][colSize - 1];dp[i][colSize -1] = Math.max(0, needMin);}// 设置最后一行的值for (int i = colSize - 2; i >= 0; --i) {int needMin = dp[rowSize - 1][i + 1] - dungeon[rowSize - 1][i];dp[rowSize - 1][i] = Math.max(0, needMin);}for (int i = rowSize - 2; i >= 0; --i) {for (int j = colSize - 2; j >= 0; --j) {// 从右边和下边选择一个最小值,然后减去当前的 dungeon 值int needMin = Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];dp[i][j] = Math.max(0, needMin);}}return dp[0][0] + 1;
}作者:fakerleet
链接:https://leetcode-cn.com/problems/dungeon-game/solution/cong-hui-su-dao-ji-yi-hua-sou-suo-dao-dong-tai-gui/

思路二:
在这里插入图片描述
在这里插入图片描述

class Solution {public int calculateMinimumHP(int[][] dungeon) {int n = dungeon.length, m = dungeon[0].length;int[][] dp = new int[n + 1][m + 1];for (int i = 0; i <= n; ++i) {Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[n][m - 1] = dp[n - 1][m] = 1;for (int i = n - 1; i >= 0; --i) {for (int j = m - 1; j >= 0; --j) {int minn = Math.min(dp[i + 1][j], dp[i][j + 1]);dp[i][j] = Math.max(minn - dungeon[i][j], 1);}}return dp[0][0];}
}作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/dungeon-game/solution/di-xia-cheng-you-xi-by-leetcode-solution/

在这里插入图片描述

【总结】

1. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2.思路 DFS -> 记忆化DFS->动态规划

转载:https://leetcode-cn.com/problems/dungeon-game/solution/cong-hui-su-dao-ji-yi-hua-sou-suo-dao-dong-tai-gui/
参考:https://leetcode-cn.com/problems/dungeon-game/solution/di-xia-cheng-you-xi-by-leetcode-solution/

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

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

相关文章

第十期:快来了解这五种热门的开发技能

开发人员是热门的工作岗位之一&#xff0c;在Indeed网站的2019年最热门工作排行榜上名次靠前。随着企业对数字化转型项目的需求不断增加&#xff0c;对能够开发这些数字化应用软件的个人的需求随之而来。 开发人员是热门的工作岗位之一&#xff0c;在Indeed网站的2019年最热门工…

蓝桥杯 平方十位数

2017 国赛c/c B组填空题集合平方十位数由0~9这10个数字不重复、不遗漏&#xff0c;可以组成很多10位数字。这其中也有很多恰好是平方数&#xff08;是某个数的平方&#xff09;。比如&#xff1a;1026753849&#xff0c;就是其中最小的一个平方数。请你找出其中最大的一个平方数…

PHP常见面试题

1.mvc是什么?相互间有什么关系? 答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller),也就是控制器,负责业务逻辑 客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,…

第十一期:数据挖掘其实就是为了干这四种事?

数据挖掘主要侧重解决四类问题&#xff1a;分类、聚类、关联、预测。数据挖掘非常清晰的界定了它所能解决的几类问题。这是一个高度的归纳&#xff0c;数据挖掘的应用就是把这几类问题演绎的一个过程。 数据挖掘最重要的要素是分析人员的相关业务知识和思维模式。一般来说&…

[剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]

【问题描述】[中等] 【解答思路】 1. 动态规划 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public int nthUglyNumber(int n) {int a 0, b 0, c 0;int[] dp new int[n];dp[0] 1;for(int i 1; i < n; i) {int n2 dp[a] * 2, n3 dp[…

第十二期:常用的几种大数据架构剖析

常用的几种大数据架构剖析 随着大数据技术的发展&#xff0c;数据挖掘、数据探索等专有名词曝光度越来越高&#xff0c;但是在类似于Hadoop系列的大数据分析系统大行其道之前&#xff0c;数据分析工作已经经历了长足的发展&#xff0c;尤其是以BI系统为主的数据分析&#xff0…

【大数据】获取一篇新闻的全部信息

作业要求来自于&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2894 给定一篇新闻的链接newsUrl&#xff0c;获取该新闻的全部信息 标题、作者、发布单位、审核、来源 发布时间:转换成datetime类型 点击&#xff1a; newsUrlnewsId(使用正则表达式re)cl…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第14篇]什么是基于线性对的密码学

这是最新的一期密码学52件事.我们基于前几周介绍一种"对"的概念. 对的定义 给定三个循环群G1,G2,G3,它们的基为q,生成器分别为g1,g2,g3.我们说一个函数e:G1G2→G3是一个密码对如果下面的等式都成立. [双线性]∀A,B∈G1,C,D∈G2:e(AB,C)e(A,C)⋅e(B,C),同时e(A,CD)…

第十五期:真相了,中台到底“出路”还是“末路”?

从 2015 年开始&#xff0c;到 2019 年现在为止&#xff0c;各大公司都在吹捧中台理念。 从 2015 年开始&#xff0c;到 2019 年现在为止&#xff0c;各大公司都在吹捧中台理念。 仿佛中台是业务复杂性的救世主&#xff0c;是某些架构师和 PM 的新出路&#xff0c;各种割韭菜的…

蓝桥杯 2017 国赛B组C/C++【对局匹配】

题意就是给我们一串数 让我们尽可能地取 约束条件是a[i] 和a[i]k不能同时出现 所有元素之间相差k的元素都不能同时出现 让我们求所能取到的最大的数的和是多少分析&#xff1a; dp思路&#xff0c;这个和树形dp有点相似 就是枚举0~k 然后在每个这个元素上迭代加k 每个元素保存…

架构师成长之路:如何保证消息队列的高可用

问题一&#xff1a;描述一下 JVM 的内存区域    程序计数器&#xff08;PC&#xff0c;Program Counter Register&#xff09;。在 JVM 规范中&#xff0c;每个线程都有它自己的程序计数器&#xff0c;并且任何时间一个线程都只有一个方法在执行&#xff0c;也就是所谓的当…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第27篇]什么是对称密码加密的AEAD安全定义?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。这篇文章将从“安全定义和证明”一节开始&#xff0c;对认证加密进行简要概述。 AEAD Luke在最近的一篇文章…

dell的boot设置

1.开机后不久会有屏幕提示&#xff0c;然后按提示按F2就可以进入BIOS的界面了。也可以按F12后选择在菜单中选择"BIOS SETUP”进入。 2.设置BIOS时间:进入BIOS后&#xff0c;用左右箭头移动到“MAIN”选项,一般进入默认就是它&#xff0c;然后用上下箭头移动到System Time…

[转帖]Docker 清理占用的磁盘空间

Docker(二十七)-Docker 清理占用的磁盘空间 https://www.cnblogs.com/zhuochong/p/10076599.htmldocker system docker network一系列的docker 命令 感觉挺有裨益的 去年的时候还用过 一段时间不用 忘记的干干净净了. 1. docker system命令 docker system df命令&#xff0c;类…

2017蓝桥杯决赛-发现环 数据结构|搜索

问题描述小明的实验室有N台电脑&#xff0c;编号1~N。原本这N台电脑之间有N-1条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。不过在最近一次维护网络时&#xff0c;管理员误操作使得某两台电脑之间增加了一条数…

第十七期:详解大数据处理中的Lambda架构和Kappa架构

在这张架构图中&#xff0c;大数据平台里面向用户的在线业务处理组件用褐色标示出来&#xff0c;这部分是属于互联网在线应用的部分&#xff0c;其他蓝色的部分属于大数据相关组件&#xff0c;使用开源大数据产品或者自己开发相关大数据组件。 典型互联网大数据平台架构 首先我…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第28篇]什么是公钥密码学的IND-CCA安全定义?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。讨论了用于公钥加密的IND-CCA安全性。 IND-CCA安全代表选择明文的不可伪造性。这样的安全方案的思想就是给定…

玩转oracle 11g(51):select t.*,t.rowid

select t.*,t.rowid from wii_device_master t; ‘ 点开解锁 复制ctrlc crtl v加入新的值 很简单&#xff0c;sql语句后面加上for update即可&#xff1a; 但是今天遇到一种情况&#xff0c;无法对该表进行修改&#xff0c;因为这样会锁表的 下面这样写比较好&#xff0c;也…

[小技巧][Markdown]上标 /下标 上下角标

标签写法效果上标2 10 上标2 10下标H2O下标H2O //上标 2<sup> 10 </sup> 2 ^10^ //下标 H<sub>2</sub>O H~2~O//上标 2 10 2 10 //下标 H2O H2O [总结] 1.上标 sup标签 &#xff1a; <sup> 内容 </sup> ^ : ^内容^2.下标 sub标…

第十八期:专家认为对“人工智能+教育”应持审慎态度

随着人工智能不断发展,人脸识别技术被越来越多地应用于校园中。据了解,一所知名大学2019级新生“刷脸”就能瞬间完成报到程序,系统是这所学校的学生研发的,学生对着摄像头,人脸识别系统就开始进行比对,眨眼间就能完成扫描,整个报到注册手续几乎不到一秒钟。 制图/李晓军 ● 人…