动态规划|【路径问题】|174.地下城游戏

简介: 动态规划|【路径问题】|174.地下城游戏

题目

174. 地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快解救公主,骑士决定每次只 向右 或 向下 移动一步。

返回确保骑士能够拯救到公主所需的最低初始健康点数。

注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

示例 1:

输入:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]]

输出:7

解释:如果骑士遵循最佳路径:右 -> 右 -> 下 -> 下 ,则骑士的初始健康点数至少为 7 。

示例 2:

输入:dungeon = [[0]]

输出:1


提示:

  • m == dungeon.length
  • n == dungeon[i].length
  • 1 <= m, n <= 200
  • -1000 <= dungeon[i][j] <= 1000

代码

int min(int a,int b)
{
    return (a<=b)?a:b;
}
int max(int a,int b)
{
    return (a>b)?a:b;
}
int calculateMinimumHP(int** dungeon, int dungeonSize, int* dungeonColSize) 
{
    int dp[202][202]={0};
    int n=dungeonColSize[0];
    int m=dungeonSize;
    for(int i=0;i<202;i++)
    {
        for(int j=0;j<202;j++)
        {
            dp[i][j]=INT_MAX;
        }
    }
    dp[m-1][n]= dp[m][n-1]=1;
   
   
    
    //[i,j]以i,j位置为起点到达终点所需的最小点数
    //那么为什么不能用i,j位置为结尾从起点到达所需的最小点数,因为这个位置不仅受前面影响也是受后面的影响的
    for(int i=m-1;i>=0;i--)
    {
        for(int j=n-1;j>=0;j--)
        {
            //分两种情况,
            //从i,j位置往右走,假设dp i,j位置里面是x,x既要能走过原来的也要能走要下一个因此x=dp[i][j+1]-dungeon[i][j]
            //从i,j位置往下走,同理x=dp[i+1][j]-dungeon[i][j]
            dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j];
            //如果这个血包很大,也就是dungeon[i-1][j-1]很大dp[i][j]会变成负的,
            //dungeon[i-1][j-1],很大就是说就算过来的是负值也可以走到结尾,但是过来不能是负的,最小也要是1
            dp[i][j]=max(1,dp[i][j]);
        }
    }
    return dp[0][0];
}
相关文章
|
应用服务中间件 nginx Docker
在 Docker 中部署 Nginx 并挂载配置文件
在 Docker 中部署 Nginx 并挂载配置文件
|
JSON 数据格式
axios实现RESTful请求规范
GET:获取数据后端将参数当做url 参数 接收 this.axios.get('/url/user', { params: { "name": "kevin", "password": "123456" } }) .
6345 0
|
JavaScript 小程序 前端开发
vue实现微信小程序,代码实例以及如何调试
@[TOC](目录) 要调试 Vue 实现的微信小程序,您需要使用微信开发者工具进行调试。以下是一个简单的 Vue 实现的微信小程序的代码示例,以及如何使用微信开发者工具进行调试的步骤。 # 1. 首先,确保已经安装了 Vue CLI,然后使用 Vue CLI 创建一个新的 Vue 项目: ``` npm install -g @vue/cli vue create my-wechat-app cd my-wechat-app ``` # 2. 在项目中安装微信小程序开发依赖: ``` npm install wechat-jsapi wechat-devtools ``` #
1784 0
|
SQL 数据采集 分布式计算
Hive电商数仓实战
以电商数据为基础,详细介绍数据处理流程,结合hive数仓、spark开发采用多种方式实现大数据分析。
1082 0
Hive电商数仓实战
|
安全 编译器 C语言
Dev-C++5.11安装教程
Dev-C++5.11安装教程
1970 0
Dev-C++5.11安装教程
|
存储 移动开发 小程序
SoloPi:支付宝 Android 专项测试工具 | 开源
近年来,随着移动互联网的蓬勃发展,移动测试技术也取得了长足的进步,从早期基于测试脚本的单机自动化,到录制回放、图像识别、云测平台等测试技术贴合实际业务需求深度应用和创新,测试效率从而一次又一次被提升。
2696 0
SoloPi:支付宝 Android 专项测试工具 | 开源
|
存储 自然语言处理 算法
Elasticsearch Search API之(Request Body Search 查询主体)-上篇
Elasticsearch Search API之(Request Body Search 查询主体)-上篇
Elasticsearch Search API之(Request Body Search 查询主体)-上篇
|
监控 网络协议 NoSQL
consul的HTTP API和使用方法
consul的HTTP API和使用方法
1466 0
consul的HTTP API和使用方法
|
网络协议
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused解决方案
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused解决方案
931 0
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused解决方案

热门文章

最新文章