• 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];
        }
    };
    
        
  • 相关阅读:
    什么是模块化及其优点是什么
    oop的三大特性和传统dom如何渲染
    MVC和MVVM的差别
    SpringMVC实例及注解(二)
    Spring MVC实例创建(一)
    Mybatis联合查询(一)
    Mybatis参数传递及返回类型
    Mybatis实例增删改查(二)
    Mybatis实例及配置(一)
    SpringMVC
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/13295461.html
Copyright © 2020-2023  润新知