动态规划|【路径问题】|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

代码

cpp 复制代码
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];
}
相关推荐
独自破碎E18 分钟前
【前缀和+哈希】LCR_011_连续数组
算法·哈希算法
一条大祥脚25 分钟前
26.1.26 扫描线+数论|因子反演+子序列计数|树套树优化最短路
数据结构·算法
m0_5613596728 分钟前
基于C++的机器学习库开发
开发语言·c++·算法
星空露珠35 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_8324027536 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉44 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji52611 小时前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_763472461 小时前
C++网络编程(Boost.Asio)
开发语言·c++·算法
依依yyy1 小时前
沪深300指数收益率波动性分析与预测——基于ARMA-GARCH模型
人工智能·算法·机器学习
hcnaisd21 小时前
深入理解C++内存模型
开发语言·c++·算法