【动态规划专栏】专题二:路径问题--------6.地下城游戏

简介: 【动态规划专栏】专题二:路径问题--------6.地下城游戏


题目来源

本题来源为:

Leetcode 174. 地下城游戏

题目描述

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

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

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

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

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

算法原理

1.状态表示

经验+题目要求

对于本题而言就是:

dp[i][j]表示:从[i,j]位置的出发,到达终点,所需要的最低初始健康点数

2.状态转移方程

分两种情况:

因此状态方程为:

为什么最后还要和1取Max呢?这是为了防止最后结果是个负数

dp[i][j]=min(dp[i+1][j],dp[i][j+1])-d[i][j];
dp[i][j]=max(1,dp[i][j]);

3.初始化

看图分析很容易就知道应该如何初始化。

4.填表顺序

从下往上填每一行,每一行从右往左

5.返回值

dp[0][0]

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int calculateMinimumHP(vector<vector<int>>& d) 
    {
        int m=d.size(),n=d[0].size();
        //创建dp表
        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])-d[i][j];
                dp[i][j]=max(1,dp[i][j]);
            }
        }
        return dp[0][0];
    }
};

时间复杂度:O(MxN)

空间复杂度:O(MxN)

相关文章
|
10月前
|
算法 机器人
【动态规划专栏】专题二:路径问题--------5.最小路径和
【动态规划专栏】专题二:路径问题--------5.最小路径和
68 0
|
10月前
|
算法
【动态规划专栏】专题三:简单多状态dp--------2.打家劫舍II
【动态规划专栏】专题三:简单多状态dp--------2.打家劫舍II
69 0
|
10月前
|
算法
【动态规划专栏】专题二:路径问题--------3.礼物的最大价值
【动态规划专栏】专题二:路径问题--------3.礼物的最大价值
60 0
|
10月前
|
存储 算法
【优选算法专栏】专题十六:BFS解决最短路问题---前言
【优选算法专栏】专题十六:BFS解决最短路问题---前言
80 1
|
10月前
BUUCTF----飞机大战,解题思路
BUUCTF----飞机大战,解题思路
|
10月前
|
算法
【动态规划专栏】专题三:简单多状态dp--------4.粉刷房子
【动态规划专栏】专题三:简单多状态dp--------4.粉刷房子
73 2
|
9月前
|
存储 算法 数据挖掘
力扣174题动态规划:地下城游戏(含模拟面试)
力扣174题动态规划:地下城游戏(含模拟面试)
动态规划|【路径问题】|174.地下城游戏
动态规划|【路径问题】|174.地下城游戏
|
算法 Java Python
【算法模板】DFS秒杀模板—附练习题(阳光号启航)(一)
【算法模板】DFS秒杀模板—附练习题(阳光号启航)(一)
1126 0
【算法模板】DFS秒杀模板—附练习题(阳光号启航)(一)
|
C语言
C语言编程之经典小游戏----扫雷
C语言编程之经典小游戏----扫雷
150 0
C语言编程之经典小游戏----扫雷