IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> leetcode174.地下城游戏 -> 正文阅读

[C++知识库]leetcode174.地下城游戏

题目:174.地下城游戏

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
    // 正向思维(自顶向下):走到任何一个位置时,血量都不能少于1并且到达终点时为1。
    // 最低初始健康点数(最小为1)a + 路径中血(增/减)逐个相加出现的最低值(负值)b >= 1
    // 但是从左上往右下的顺序注定a和b都会影响后续的决策。也就是说,这样的动态规划是不满足「无后效性」。
    // 逆向思维(自底向上):
    // 在每个路径上的点满足要求,最终求起点的血量,从终点(只剩1血)开始逐渐向左上角移动。由:
    // x-2 >= 1
    // x-2-3 >= 1
    // x-2-3+3 >= 1
    // x-2-3+3+1 >= 1
    // x-2-3+3+1-5 = 1 
    // 反过来:
    // x-2-3+3+1 = 1+5
    // x-2-3+3 = 1+5-1
    // x-2-3 = 1+5-1-3
    // x-2 = 1+5-1-3+3
    // x = 1+5-1-3+3+2 即 x = 7, 这样就无需考虑b且无后效性问题
    // dp[i][j] = max(min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j], 1)

        int m = dungeon.length;
        int n = dungeon[0].length;
        int[][] dp = new int[m+1][n+1];
        Arrays.fill(dp[m], Integer.MAX_VALUE); // 数组批量赋值,只能一位数组
        for(int j=0; j<=m; j++)
            dp[j][n] = Integer.MAX_VALUE;
        dp[m-1][n] = 1;
        dp[m][n-1] = 1;
        for(int i=m-1; i>=0; i--)
            for(int j=n-1; j>=0; j--)
                dp[i][j] = Math.max(Math.min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j], 1);
        return dp[0][0];
    }
}

看到一位网友的C++代码也很简洁:

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));
        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--){
                dp[i][j]=max((min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]),1);
            }
        }   
        return dp[0][0];
    }
};
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:19:22  更:2021-08-01 14:19:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 12:59:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码