首页 > 其他分享 >动态规划 —— 路径问题-地下城游戏

动态规划 —— 路径问题-地下城游戏

时间:2024-11-02 13:18:10浏览次数:3  
标签:状态 填表 游戏 初始化 int 路径 dp 地下城 本题

1. 地下城游戏

题目链接:

174. 地下城游戏 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/dungeon-game/description/

 


2.  算法原理 

状态表示:以莫一个位置位置为结尾或者以莫一个位置为起点

   

dp[i,j]表示:到达[i,j]位置的时候,骑士所需要的最低初始健康点数(X),这个状态表示是错误的,因为如果是以莫一个位置为结尾来推导的话我们会发现我们正向推导的时候是不断的修改我们之前的状态,无法得到一个准确的状态

  

所以本题应该以莫一个位置为起点来开始推断:从[i,j]位置出发,到达终点,dp[i,j]里面存储的值就是所需的最低初始健康点数

2. 状态转移方程

  

根据最近的一步来划分问题:

   

到达dp[i][j]有两种情况:

                                        1. 往右边走:dp[i,j+1] - d[i][j]

        

                                        2. 往下走:dp[i+1,j] - d[i][j]
    

    

本题的状态转移方程是:dp[i][j] = min(dp[i,j+1]  ,dp[i+1,j]) - d[i][j]

    

因为最低健康点数还有可能为负数,那么我们还需要对它进行一次比对:

   

                                dp[i][j] =max(1,dp[i][j] )        如果为负数则返回1,否则不变

3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行

    

本题状态依赖的是下面和右边的状态,所以会越界的位置是下面的一行和右边的一列,那么我们可以在下面的一行和右边的一列再额外的加上一行和一列的虚拟节点

   

因为是在下面的一行和右边的一列加上了虚拟节点,所以不用考虑下标的映射关系,只需要保证后面的填表是正确的

    

当解救完公主之后走到下面或者右边的时候,最少要剩下1滴健康点数,其余虚拟节点的值是取最小的值,为了防止影响到最终结果,所以我们将其初始化为正无穷大

   

4. 填表顺序 

    

本题的填表顺序是:从下往上填写每一行,每一行的值是从右往左

5. 返回值 :题目要求 + 状态表示 

    

本题的返回值是:dp[0][0]


3.代码  

动态规划的固定四步骤: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
        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];
    }
};


感谢观看~ 

标签:状态,填表,游戏,初始化,int,路径,dp,地下城,本题
From: https://blog.csdn.net/hedhjd/article/details/143446747

相关文章

  • 通义灵码实操—飞机大战游戏
    通义灵码实操—飞机大战游戏有没有想象过自己独立编写一个有趣的小游戏。在本实践课程中,你不仅可以实现这个想法,而且还将得到通义灵码智能编程助手的支持与指导。我们将携手步入编程的神奇世界,以一种简洁、高效且具有创造性的方式,一步步构建起一个完全属于你自己的个性化小......
  • 基于stm32f403zet6游戏摇杆手柄
     一、硬件准备    (1)stm32f403zet6   (2)游戏摇杆扩展板                (3)oled模块        (4)hc-05蓝牙模块(5)电动小马达(6)其它模块温湿度模块,led灯和其它按键都集成在stm32f403zet6上了。如果有需要,也可以单独购买。二、设......
  • 番外番外——猜数字游戏
    文章目录猜数字习一、随机数的生成1.1rand函数1.2srand函数1.3time1.4设置随机数的范围二、猜数字游戏实现三、结尾猜数字习写一个猜数字游戏游戏要求:电脑自动生成1~100的随机数玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏......
  • C语言入门:扫雷小游戏的实现
        目录一.基本介绍二.创建棋盘三.布置随机雷四.判断并反馈五.总结     一.基本介绍        扫雷,想必大家并不陌生。     这样一个9*9棋盘里,藏着十个雷,我们随便点开一个方格:    这样子,就出现了一些数字,而数字代表这......
  • 计算机网络:网络层 —— 开放最短路径优先 OSPF
    文章目录路由选择协议动态路由协议开放最短路径优先OSPF链路状态OSPF路由器邻居关系的建立和维护链路状态通告链路状态更新分组链路状态数据库OSPF的五种分组类型OSPF的基本工作过程多点接入网络中的OSPF路由器OSPF划分区域OSPF区域的类型OSPF区域的相关概念路......
  • Bash脚本当中获取当前脚本绝对路径位置
    Bash脚本当中获取当前脚本绝对路径位置在Bash脚本中,一般使用命令获取当前目录,而不是直接依赖相对路径,这是因为相对路径的基础是脚本的运行位置,相对路径可能会因为脚本的运行位置不同而发生变化,导致脚本找不到指定文件或目录。获取脚本所在的目录可以使脚本更具通用性和可靠性,不......
  • 21点游戏(简易版)的C语言实现
    新人做的第一个小游戏,以后可能会改为更为严谨的规则,以及加入筹码。代码如下:#include<stdio.h>#include<time.h>#include<stdlib.h>staticintyes1=1,yes2=1;/*非0代表能继续摸牌*/voidintroduction()/*介绍游戏规则*/{ printf("BlackJack(21点)游戏规则:\n2......
  • 爬虫ip与反爬虫的“猫鼠游戏”
    大家好!在网络世界中,爬虫和反爬虫就像汤姆和杰瑞一样,他们在里面上演着一场场精彩绝伦又硝烟弥漫的“猫鼠游戏”,今天小蝌蚪就来带大家看看这部精彩的“猫和老鼠”。爬虫简单来说是一种智能程序,它的使命就是从无数的网页中挖掘出有价值的数据。就像一个知识渊博的学者在古老的图......
  • VR游戏和传统游戏在体验上有多大差异_1
    ​​虚拟现实(VR)游戏和传统视频游戏在玩家体验上呈现显著差异,这些差异主要体现在以下等方面:1.沉浸感和现实感;2.交互方式和控制;3.硬件需求和可访问性;4.游戏设计和内容;5.社交互动;6.身体参与和舒适度。VR游戏通过创新的技术提供了更为沉浸式的游戏体验,而传统游戏则依靠成熟的平台和广......
  • 胎神小游戏 - 自定义小游戏-改
    ```cpp#include<bits/stdc++.h>#include<windows.h>#include<stdio.h>#include<conio.h>#include<time.h>usingnamespacestd;boolBlack;voidColor(inta){if(Black==1){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN......