LeetCode題:174. 地下城游戲

目錄

一、題目要求

二、解題思路

(1)狀態表示

(2)狀態轉移方程

(3)初始化dp表

(4)填表順序

(5)返回值

三、代碼


一、題目要求

174. 地下城游戲

惡魔們抓住了公主并將她關在了地下城?dungeon?的?右下角?。地下城是由?m x n?個房間組成的二維網格。我們英勇的騎士最初被安置在?左上角?的房間里,他必須穿過地下城并通過對抗惡魔來拯救公主。

騎士的初始健康點數為一個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。

有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間里的值為負整數,則表示騎士將損失健康點數);其他房間要么是空的(房間里的值為?0),要么包含增加騎士健康點數的魔法球(若房間里的值為正整數,則表示騎士將增加健康點數)。

為了盡快解救公主,騎士決定每次只?向右?或?向下?移動一步。

返回確保騎士能夠拯救到公主所需的最低初始健康點數。

注意:任何房間都可能對騎士的健康點數造成威脅,也可能增加騎士的健康點數,包括騎士進入的左上角房間以及公主被監禁的右下角房間。

示例 1:

輸入:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]]
輸出:7
解釋:如果騎士遵循最佳路徑:右 -> 右 -> 下 -> 下 ,則騎士的初始健康點數至少為 7 。

示例 2:

輸入:dungeon = [[0]]
輸出:1

二、解題思路

這題我們用到動態規劃的思想,分析題目,我們要從左上角走到右下角,求我們最小初始健康點數是多少。

(1)狀態表示

按往常經驗,我們喜歡以某個點為終點,填這個位置在dp表中的值是多少,因為在這里,如果以某個點為終點,從前面到這個位置所需要的最小健康點數,就是前面消耗健康點數到這個位置還剩1個健康點數,但到這個位置還剩一個健康點數,要是沒到右下角呢,還要走好多步,肯定是還沒到右下角就已經死掉了。

所以,這里的狀態表示:定義以某個位置為起點,到達右下角所需要的最小健康點數

(2)狀態轉移方程

如圖:

我們想在dp表的四角星位置放值,放的是在原表中從四角星位置到右下角所需最小健康點數,那么,我們知道每個dp表放的都是當前位置到右下角所需健康的最小點數,設當前點數為x,要能從當前位置走到右下角,那么走到下一個位置時的位置,還有的點數要大于等于下一個位置的點數,設原表為d,有一個新建出的dp表

所以我們推導出:x + d[ i ][ j ] >= dp[ i + 1 ][ j ] 或?x + d[ i ][ j ] >= dp[ i ][ j + 1 ]

所以,x =?dp[ i + 1 ][ j ] -?d[ i ][ j ] 或?x =?dp[ i ][ j + 1 ] -?d[ i ][ j ]

那么我們就要就要從右邊或者下邊,拿一個點數最小的值,走到下一步還需要的健康點數,當然是少的符合題目要求。

合并:x = min(dp[ i + 1 ][ j ],dp[ i ][ j + 1 ]) - d[ i ][ j ]

特殊情況:當前位置如果是一個很大的正整數,也就是一個大血包,那么x就會算出負數,這時候就不符合我們的預期了,因為當前位置的點數是負數,也可以走到右下角,就不符合題目要求了,負數早就死了,所以我們當前x值大于0時,就不做處理,x還是原來的值,當x值小于等于0時,當前位置就放一個1,至少有血還能繼續往下走。

推出:當前位置的值:max(1,x)

(3)初始化dp表

根據我們定義的狀態表示,我們要知道下面和左邊的dp表值,才能推出當前的dp表值,所以最后一行和最后一列可能會數組越界,我們多加最后一行和最后一列,并且兩個位置初始化為1,其他位置初始化為正無窮,如圖:

因為,騎士要到右下角,最后至少必須要有1個健康點數,才能到右下角,說明到右下角值至少需要1個健康點數,而其他位置初始化為正無窮是為了不影響最后一行和最后一列填表,比如最后一行,處除了右下角,只能往往右邊走,最后一列,只能往下走。所以得到的是右邊的dp值,右邊的值肯定比正無窮小。

(4)填表順序

從右到左,從下到上

(5)返回值

return dp[0][0]

三、代碼

class Solution {public int calculateMinimumHP(int[][] dungeon) {//1、創建dp表int row = dungeon.length;//行int col = dungeon[0].length;//列int[][] dp = new int[row + 1][col + 1];//2、初始化dp表for(int i = 0; i < col + 1; i++) {//初始化最后一行dp[row][i] = Integer.MAX_VALUE;}dp[row][col - 1] = 1;//最后一行的特殊位置for(int i = 0; i < row + 1; i ++) {//初始化最后一列dp[i][col] = Integer.MAX_VALUE;}dp[row - 1][col] = 1;//最后一列的特殊位置//3、填dp表(順序:從右到左,從下到上)for(int i = row - 1; i >= 0; i--) {for(int j = col - 1; j >= 0; j--) {int min = Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];dp[i][j] = Math.max(1, min);}}//4、返回值return dp[0][0];}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207631.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

swagger入門

swagger入門 pom依賴 不用專門導入swagger 因為springboot已經將它集成了 org.springframework.boot spring-boot-starter com.github.xiaoymin knife4j-spring-boot-starter Swagger配置類 Configuration public class SwaggerConfig { // 創建并配置Docket Bean&#xf…

snakeyaml編輯yaml文件并覆蓋注釋

文章目錄 前言技術積累實戰演示1、引入maven依賴2、覆蓋注釋工具類3、snakeyaml工具類4、測試用例5、測試效果展示 寫在最后 前言 最近在做一個動態整合框架的項目&#xff0c;需要根據需求動態組裝各個功能模塊。其中就涉及到了在application.yaml中加入其他模塊的配置&#…

TCP傳輸層詳解(計算機網絡復習)

介紹&#xff1a;TCP/IP包含了一系列的協議&#xff0c;也叫TCP/IP協議族&#xff0c;簡稱TCP/IP。該協議族提供了點對點的連接機制&#xff0c;并將傳輸數據幀的封裝、尋址、傳輸、路由以及接收方式都予以標準化 TCP/IP的分層模型 在講TCP/IP協議之前&#xff0c;首先介紹一…

力扣貪心題解 跳躍游戲

55. 跳躍游戲 - 力扣&#xff08;LeetCode&#xff09; 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b…

信息系統開發方法

企業信息系統對于企業信息化的重要意義是不言而喻的。從實際運行的效果來看&#xff0c;有些信息系統運行得很成功&#xff0c;取得了巨大的經濟效益和社會效益&#xff1b;但也有些信息系統效果并不顯著&#xff0c;甚至還有個別信息系統開始時還能正常運行&#xff0c;可時間…

廣州數字孿生賦能工業制造,加速推進制造業數字化轉型

廣州數字孿生賦能工業制造&#xff0c;加速推進制造業數字化轉型。數字孿生系統基于歷史數據、實時數據&#xff0c;采用人工智能、大數據分析等新一代信息技術對物理實體的組成、特征、功能和性能進行數字化定義和建模。通過構建在信息世界對物理實體的等價映射&#xff0c;對…

Axure官方軟件安裝、漢化保姆級教程(帶官方資源下載)

1.下載漢化包 百度云鏈接&#xff1a;https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取碼&#xff1a; jqxn 2.解壓壓縮包 3.安裝Axure 進行安裝 點擊next 打勾&#xff0c;然后next, 默認是c盤&#xff0c;修改成自己的文件夾&#xff08;不要什么都放c盤里…

RestTemplate硬編碼的使用

RestTemplate是由Spring框架提供的一個可用于應用中調用rest服務的類它簡化了與http服務的通信方式&#xff0c;統一了RESTFul的標準&#xff0c;封裝了http連接&#xff0c;我們只需要傳入url及其返回值類型即可。相較于之前常用的HttpClient&#xff0c;RestTemplate是一種更…

API測試基礎之http協議

http簡介&#xff1a; http&#xff08;超文本傳輸協議&#xff09;是一個簡單的請求-響應協議&#xff0c;它通常運行在TCP&#xff08;傳輸控制協議&#xff09;之上。它指定了客戶端可能發送給服務器什么樣的消息以及得到什么樣的響應。請求和響應消息的頭以ASCII碼形式給出…

遠程控制如何賦能智能制造?貝銳向日葵制造業場景案例解析

隨著數字化轉型在制造業的不斷深入&#xff0c;企業在產線端也逐漸投入更多智能化設備&#xff0c;數字化、智能化設備其中一個比較顯著的優勢就是可以依托互聯網實現遠程運維和調試&#xff0c;大大提升產線設備的穩定性和工作效率&#xff1b;而遠程調試運維一個重要的實現方…

人工智能原理復習--搜索策略(一)

文章目錄 上一篇搜索概述一般圖搜索盲目搜索下一篇 上一篇 人工智能原理復習–確定性推理 搜索概述 問題求解分為兩大類&#xff1a;知識貧乏系統&#xff08;依靠搜索技術解決&#xff09;、知識豐富系統&#xff08;依靠推理技術&#xff09; 兩大類搜索技術&#xff1a; …

海思3516DV500下的目標識別算法運行評估,包含yolov7,yolov8

目前在3516DV500下&#xff0c;自己訓練的模型的評估實測結果。根據實際模型會有些許差異。 涉及到技術細節的部分因為商業用途&#xff0c;有部分省略。如需相關技術服務項目合作可私信聯系。 我司推出的目標識別跟蹤模塊&#xff0c;支持熱紅外、可見光主流多光譜視頻輸入與目…

WeiPHP 微信開發平臺 SQL注入漏洞復現

0x01 產品簡介 weiphp 是一個開源,高效,簡潔的微信開發平臺,基于 oneThink 內容管理框架實現。 0x02 漏洞概述 weiphp 微信開發平臺 _send_by_group、 wp_where、 get_package_template等接口處存在 SQL 注入漏洞,攻擊者利用此漏洞可獲取數據庫中的信息(例如,管理員后臺…

三數組最小距離:2020年408算法題

算法思想 算法實現 #define INT_MAX 0x7fffffff //c語言int類型最大值 //計算絕對值 int abs(int a){if(a<0) return -a;else return a; } //判斷a是否為3個數中最小值 bool isMin(int a,int b,int c){if(a<b&&a<c) return true;return false; }//主函數 in…

RepidJson中Writer類、FilewriteStream類、 PrettyWriter類的區別

rapidjson是一個C的JSON解析庫&#xff0c;可以用于解析和序列化JSON數據。 Writer是rapidjson中一種基本的輸出流&#xff0c;用于將JSON數據輸出到字符串或文件中。 FileWriteStream是一個Writer的子類&#xff0c;它專門用于將JSON數據輸出到文件中。相比于普通的Writer&a…

平臺工程文化:軟件開發的創新路徑和協作之道

在快速發展的軟件開發領域&#xff0c;具有前瞻性思維的企業組織正在擁抱平臺工程文化的變革力量。這種創新方法強調創建共享平臺、工具和實踐&#xff0c;使開發人員能夠更快、更高效地交付高質量的軟件。在本文中&#xff0c;我們將深入探討平臺工程文化的核心原則和深遠的好…

C語言期末考試復習PTA數據類型及表達式-分支結構程序-循環結構-數組經典選擇題

目錄 第一章&#xff1a;C語言數據類型和表達式 第一題&#xff1a; 第二題&#xff1a; 第三題&#xff1a; 第四題&#xff1a; 第五題&#xff1a; 第六題&#xff1a; 第七題&#xff1a; 第八題&#xff1a; 第九題&#xff1a; 第二章&#xff1a;分支結構程序…

打包 抖音直播云游戲

抖音直播云游戲 oaid資源中的bcpkix-jdk15to18-1.68.jar與抖音云游戲的資源沖突。 其實資源名稱是一樣的&#xff0c;拷貝時資源名稱有變化。 為解決此問題&#xff0c;需要規范化文件的資源名稱&#xff0c;將.置為_ Error: Command failed: cmd /c echo off && Chc…

NoSuchColumnFamilyException: org.apache.hadoop.hbase.regionserv

問題 在IDEA運行HBASE腳本時出現如下報錯&#xff1a; org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: Column family table does not exist in region hbase:meta,,1.1588230740 i…

Java多線程并發(二)

四種線程池 Java 里面線程池的頂級接口是 Executor&#xff0c;但是嚴格意義上講 Executor 并不是一個線程池&#xff0c;而只是一個執行線程的工具。真正的線程池接口是 ExecutorService。 newCachedThreadPool 創建一個可根據需要創建新線程的線程池&#xff0c;但是在以前…