zoukankan      html  css  js  c++  java
  • 174. 地下城游戏

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

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

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

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

    编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

    例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。

    -2 (K)  -3    3
    -5       -10   1
    10      30    -5 (P)
     

    说明:

    骑士的健康点数没有上限。

    任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

     解:这道题我先用从左上往右下走,发现算出来的值特别大。是因为路径总和并不是骑士一开始就需要的,可能走到某个地,前面经过的都是负数,后面的值都是大的正数,这么算出来骑士都不需要血了。所以换个思路从右下往左上,使用动态规划

    这个方法的关键是,把dp[i][j]当做这个点骑士需要的最少的血。那么最后一个点就是1.

    二维数组需要多一行一列

    class Solution {
    public:
        int calculateMinimumHP(vector<vector<int>>& dungeon) {
            int n = dungeon.size(), m = dungeon[0].size();
        //无效的都取最大值
            vector<vector<int>> dp(n + 1, vector<int>(m + 1, INT_MAX));
        //这两个值取最少的血1    
        dp[n][m - 1] = dp[n - 1][m] = 1;
            for (int i = n - 1; i >= 0; --i) {
                for (int j = m - 1; j >= 0; --j) {
                    int minn = min(dp[i + 1][j], dp[i][j + 1]);
                    dp[i][j] = max(minn - dungeon[i][j], 1);
                }
            }
            return dp[0][0];
        }
    };
    
        
  • 相关阅读:
    11.文件操作
    10.模块和包
    9.异常
    8.单例模式
    7.类属性、类方法、静态方法
    小学口算题卡---田青正
    个人技术流程(四则运算)--马伟杰
    个人开发流程(四则运算)--张文龙
    个人技术流程(四则运算)--王潮玉
    个人技术流程(四则运算)--毛明明
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/13295461.html
Copyright © 2011-2022 走看看