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

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

时间:2024-09-21 18:54:48浏览次数:11  
标签:dungeon 格子 min -- 路径 int 地下城 dp

地下城游戏


题目链接

题目

在这里插入图片描述

五步走

状态表示

根据经验:有两种表示方式:1,以dp[i][j]为终点+巴拉巴拉 2,以dp[i][j]位置为起点+巴拉巴拉。
我开始写的时候用的第一种方式,结果没有表示出来,第二种方法可以。
dp[i][j]表示从下标为(i,j)出发,到达终点时消耗的最小健康点数。

转移方程

根据经验:找里下标(i,j)最近的位置考虑,离下标(i,j)最近的是dp[i+1][j]和dp[i][j+1],设我要从(i,j)走到终点需要的健康点数为x,x+dungeon[i][j]就表示我走出(i,j)格子剩下的健康点数,它要满足大于等于min(dp[i+1][j],dp[i][j+1])才能到达终点。
所以dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j],
注意**:当算出来dp[i][j]<=0时,说明它获得的健康点数很大足已为负数了,但是如果是<=0,那么就不能继续往下走了,所以当<=0时,要变成1**。

初始化

假设m=2,n=3
在这里插入图片描述

绿色格子里面填什么值? 要使绿色格子里的值不影响小圈格子,要使绿色格子里放INT_MAX,dp[m-1][n]=1or dp[m][n-1]=1

填表顺序

从下往上,右往左

返回值

dp[0][0]

代码

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        //创建dp表
        int m=dungeon.size();
        int n=dungeon[0].size();
        int dp[m+1][n+1];
        int i,j;
        //填表
        for(i=m;i>=0;i--)
        {
            for(j=n;j>=0;j--)
            {
                if(i==m||j==n&&i!=m-1)
                {
                    dp[i][j]=INT_MAX;
                }
                else if(j==n&&i==m-1)
                {
                    dp[i][j]=1;
                }
                else
                {
                    dp[i][j]=min(dp[i][j+1],dp[i+1][j])-dungeon[i][j];
                    if(dp[i][j]<=0)
                    {
                        dp[i][j]=1;
                    }
                }
            }
        }
        //返回
        return dp[0][0];
    }
};

标签:dungeon,格子,min,--,路径,int,地下城,dp
From: https://blog.csdn.net/2301_81236660/article/details/142421058

相关文章

  • 框架、工具包、插件、第三方库他们之间的区别和联系
    框架、工具包、插件和第三方库在软件开发中都是重要的组成部分,它们各自有着不同的定义、功能和用途,同时又相互联系。以下是对它们的详细解释以及区别和联系:框架(Framework)定义:框架是一种抽象的软件结构,它为特定类型的应用程序提供了基础架构和一套预定义的规则、组件及工......
  • kafka 消息位移提交几种方式:消息重复消息、消息丢失的关键
    消费位移Kafka中的位移(offset)是用来记录消息在分区中的位置的标志,简单说就是记录消费者的消费进度,每次消息消费后需要更新消费进度,也就是位移提交由此可见一旦位移提交发生异常,会导致消费进度不正确,就必然发生消息丢失或者重复消费消息位移存储内部主题__consumer_off......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛完善程序(33-42)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>#include<vector>usingnamespacestd;boolisSquare(intnum){ inti=__1__; intbound=__2__......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛阅读程序(16-32)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;boolisPrime(intn){ if(n<=1){ returnfalse; } for(inti=2;......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛单项选择(1-15)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客第1题32位int类型的存储范围是()A.-2147483647~+2147483647B.-2147483647~+2147483648C.-2147483648~+2147483647D......
  • 统信服务器操作系统【搭建FTP】设置介绍
    如何在操作系统上安装vsftp服务。设置匿名用户登录、设置授权用户密码访问功能,并介绍使用匿名方式、授权用户方式访问vsftp服务。本文适用于A、D、E三个服务器操作系统版本,除安装方式的差异,其他设置均相同。文章目录功能概述一、功能介绍二、准备环境三、安装步骤......
  • c语言内存函数
    1、memcpyvoid*memcpy(void*destination,constvoid*source,size_tnum);函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到'\0'的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定......
  • 为啥chrome查看到网页,只有5000多行,应该有1万多行才对
    大家好,我是皮皮。一、前言前几天在Python白银交流群【磐奚鸟】问了一个Python网络爬虫处理的问题,这里拿出来给大家分享下。二、实现过程这里【惜君】给了一个指导,可能网站有限制数据量。这里【瑜亮老师】发现了问题所在,如下图所示:数据方面确实存在,顺利地解决了粉丝的问题。三、总结......
  • 远程访问本地基于Debian Linux用于运行虚拟机和容器的Proxmox VE
    文章目录前言1.局域网访问PVE2.安装Cpolar工具3.创建PVE公网地址4.远程访问PVE5.设置固定域名6.固定地址访问前言本文主要介绍如何在Windows环境安装内网穿透工具,实现公网环境远程访问本地局域网中的ProxmoxVE平台WEB管理界面。ProxmoxVE是一个完全开源......
  • 进程-管道
    管道定义    什么是管道                管道是Unix中最古老的进程间通信的形式。        我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”                我们通常把是把一个进程的输出连接或“......