动态规划10:174. 地下城游戏

news/2024/10/9 2:25:42/

动态规划解题步骤:

1.确定状态表示:dp[i]是什么

2.确定状态转移方程:dp[i]等于什么

3.初始化:确保状态转移方程不越界

4.确定填表顺序:根据状态转移方程即可确定填表顺序

5.确定返回值

题目链接:174. 地下城游戏 - 力扣(LeetCode)

题解:

本题使用从起点开始到达dp[i][j]位置的方法行不通,因为dp[i][j]不仅被前面的位置影响,还会被后面位置影响

所以本题使用从dp[i][j]位置开始到达终点的方法

1.状态表示:dp[i][j]表示从dungeon[i][j]位置出发到达终点所需最低初始健康点数

2.状态转移方程:dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]; if(dp[i][j]<=0) dp[i][j]=1

3.初始化:在右下角多开一行一列,初始化和填表合并(多开位置需要填值:[m][n-1]和[m-1][n]位置填1,其余位置为正无穷)

4.填表顺序:从右下角往左上角填写

5.返回值:dp[0][0]

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {//状态表示//dp[i][j]表示从dungeon[i][j]位置出发到达终点所需最低初始健康点数//状态转移方程//dp[i][j]=min(dp[i+1][j]-dungeon[i][j],dp[i][j+1]-dungeon[i][j])//if(dp[i][j]<=0) dp[i][j]=1//创建dp表size_t m=dungeon.size();size_t n=dungeon[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));//多开一行一列,但是右下角//初始化dp[m][n-1]=dp[m-1][n]=1;//填表(从右下角到左上角)for(int i=m-1;i>=0;--i){for(int j=n-1;j>=0;--j){dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j];if(dp[i][j]<=0) dp[i][j]=1;//最低健康值不可能为负数或0,最低为1}}return dp[0][0];}
};

这是使用从起点开始到达dp[i][j]位置的方法,此代码不行

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {//dp[i][j]表示到达dungeon[i][j]所需的最低初始健康点数//if(dungeon[i][j]<0)//dp[i][j]=min(dp[i-1][j]-dungeon[i][j],dp[i][j-1]-dungeon[i][j])//创建dp表size_t m=dungeon.size();size_t n=dungeon[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));//多开一行一列dp[0][1]=dp[1][0]=1;//填表for(int i=1;i<m+1;++i){for(int j=1;j<n+1;++j){if(dungeon[i-1][j-1]<0)dp[i][j]=min(dp[i-1][j]-dungeon[i-1][j-1],dp[i][j-1]-dungeon[i-1][j-1]);elsedp[i][j]=min(dp[i-1][j],dp[i][j-1]);}}return dp[m][n];}
};

http://www.ppmy.cn/news/1536420.html

相关文章

Webstorm 中对 Node.js 后端项目进行断点调试

首先&#xff0c;肯定需要有一个启动服务器的命令脚本。 然后&#xff0c;写一个 debug 的配置&#xff1a; 然后&#xff0c;debug 模式 启动项目和 启动调试服务&#xff1a; 最后&#xff0c;发送请求&#xff0c;即可调试&#xff1a; 这几个关键按钮含义&#xff1a; 重启…

【C++ 11】nullptr 空指针

文章目录 【 0. 问题背景 】0.1 野指针和悬空指针0.2 传统空指针 NULL0.3 传统空指针的局限性 【 1. 基本用法 】【 2. nullptr 的应用 】2.1 nullptr 解决 NULL 的遗留BUG2.2 简单实例 【 0. 问题背景 】 0.1 野指针和悬空指针 总结 野指针悬空指针产生原因指针变量未被初始…

23.1 k8s监控中标签relabel的应用和原理

本节重点介绍 : relabel的源码在 7.7节做过详细的解读强大的relabel能力 在k8s中的应用 应用1&#xff1a; labelmap 在采集cadvisor指标时 对服务发现标签key名字截取应用2&#xff1a; 采集pod自定义指标中replace 和 keep的应用应用3&#xff1a; k8s服务组件采集时的endpo…

如何高效使用Prompt与AI大模型对话

一、如何与人工智能对话 在人工智能的世界里&#xff0c;提示词&#xff08;Prompt&#xff09;就像是一把钥匙&#xff0c;能够解锁AI智能助手的潜力&#xff0c;帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙&#xff0c;却是一门艺术。本文将带你了解提示词的…

WPF入门教学二十三 自定义控件开发

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;自定义控件开发是一项强大的功能&#xff0c;它允许开发者根据特定需求创建独特的用户界面元素。自定义控件可以是简单的用户控件&#xff0c;也可以是更复杂的继承自现有控件的自定义控件。以下是…

GTest测试框架介绍

文章目录 GTest使用简单的宏断言事件机制全局使用样例局部使用样例 GTest是谷歌发布的一个跨平台的单元测试框架,主要是为了在不同平台上编写的C单元测试而生成的 提供了丰富的断言,致命和非致命的判断,参数化 GTest使用 简单的宏断言 断言分两类 一类是ASSERT系列的,如果当…

通讯方面的数据,人工智能 机器学习的时候,因为数字都接近于一,数据归一化的一种方法,做了一个简化版本的Z-score标准化

这个表达式实现了一种形式的数据归一化&#xff0c;它将张量x中的每个元素除以x的标准差的估计值。这种处理方式可以使得变换后的数据具有单位标准差&#xff08;假设数据已经是零均值或者在计算过程中考虑了均值&#xff09;。具体来说&#xff0c;它是基于以下步骤进行的&…

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景&#xff0c;以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容&#xff0c;…