书籍龙与地下城游戏问题(4)0527

题目:

给定一个二维数组map。含义是一张地图,例如,如下矩阵:

-2 -3 3

-5 -10 1

0 30 -5

游戏的规则如下:

骑士从左上角出发,每次只能向右或向下走,最后到达右下角见到公主。

地图中每个位置的值代表骑士要遭遇的事情,如果是负数,说明此处有怪兽,要让骑士损失血量。如果是非负数,代表此处有血瓶,能让骑士回血。

骑士从左上角到右下角的过程中,走到任何一个位置时,血量都不能少于1。

为了保证骑士能见到公主,初始血量至少是多少?根据map,返回初始血量。

定义和地图代傲一样的矩阵,记为dp,dpij的含义是如果骑士要走上位置(i,j),并且从该位置选一条最优的路径,最后走到右下角,骑士起码应该具备的血量。根据dp的定义,我们最终需要的是dp00的结果。

dpij有两个选择向右或者是向下。

java 复制代码
public int minHP1(int[][] m){
    if(m == null || m.length ==  0 || m[0] == null || m[0].length == 0){
        return 1;
    }
    //因为整体要算dp[0][0]的值,所以计算初始化最后一行所有的列的值,循环的时候从
    //最后一行开始就行
    int row = m.lenght;
    int col = m[0].length;
    int[][] dp = new int[row--][col--];
    //下面的row和col已经做了减减处理
    dp[row][col] = m[row][col] > 0 ? 1 : -m[row][col] + 1;
    for(int j = col -1; j>=0;j--){
      dp[row][j] = Math.max(dp[row][j+1] - m[row][j],1);  
    }
    int right = 0;
    int down = 0;
    for(int i = row -1;i>=0;i--){
        dp[i][col] = Math.max(dp[i+1][col] - m[i][col],1);
        for(int j=col-1;j>=0;j--){
            right = Math.max(dp[i][j+1] - m[i][j],1);
            down = Math.max(dp[i+1][j] - m[i][j],1);
            dp[i][j] = Math.min(right,down);
        }
    }
    return dp[0][0];
}
相关推荐
带多刺的玫瑰2 分钟前
Leecode#35刷题之搜索插入位置
java·python·算法
狂人开飞机14 分钟前
27、实战物理益智游戏
游戏·游戏引擎·godot
我不会起名字32224 分钟前
万字总结Golang入门项目
数据结构·经验分享·算法·golang·项目实战·复盘
6Hzlia27 分钟前
【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节
c++·算法·leetcode
Niuguangshuo9 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶9 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真9 小时前
今天是学习嵌入式的第37天
linux·学习·算法
一孤程11 小时前
游戏测试专题第四篇:游戏性能测试实战-帧率/内存/发热全覆盖
游戏·测试
罗西的思考11 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技12 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led