leetcode 174. 地下城游戏「动态规划」「逆向思维」

174. 地下城游戏

题目描述:

二维矩阵,每个点都有一个价值,起点是左上角(1, 1),终点是右下角(n, m),初始价值为一个未知的正整数,每次只能往下或者往右走一步,到达一个新的点都要加上这个点的价值,过程中要保证总价值每时每刻的都要大于0(包括初始值),求所需的最小初始价值

思路:

一眼dp

这个题很显然可以转换成找一条路径,将路径上的价值看成一个数组,做前缀和,求前缀和数组的最小值 m i n x minx minx,答案就是 m a x ( 1 , 1 − m i n x ) max(1, 1-minx) max(1,1minx)

可以发现,我们需要在遍历的过程中维护两个变量,一个是从出发点到当前点的路径和,另一个是从出发点到当前点的所需的最小初始值

我们希望 从出发点到当前点的路径和 尽可能大,而 从出发点到当前点所需的最小初始值 尽可能小。这样转移方式也有两种,选择1会对后面的2好,选择2会对后面的1好,这两种转移方式各有优劣,其重要程度是相当的,会同时影响状态转移,这样的动态规划是不满足无后效性的

所以我们逆向考虑,考虑另一种状态:从 ( i , j ) (i, j) (i,j) ( n , m ) (n, m) (n,m)所需要的最小初始值,此时我们不需要考虑从 ( 1 , 1 ) (1,1) (1,1) ( i , j ) (i,j) (i,j)的路径和,所以状态转移方式是:

d p [ i ] [ j ] = m a x ( m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) − a r [ i ] [ j ] , 1 ) dp[i][j] = max(min(dp[i - 1][j], dp[i][j - 1])-ar[i][j], 1) dp[i][j]=max(min(dp[i1][j],dp[i][j1])ar[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, 1e9));
        for(int i = n - 1; i >= 0; --i){
            for(int j = m - 1; j >= 0; --j){
                if(i == n - 1 && j == m - 1)dp[i][j] = max(1, -dungeon[i][j]+1);
                else dp[i][j] = max(1, min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]);
            }
        }
        return dp[0][0];
    }
};

相关推荐

  1. leetcode 174.地下游戏

    2024-07-19 04:50:01       34 阅读
  2. LeetCode 174.地下游戏 Python题解

    2024-07-19 04:50:01       39 阅读
  3. 174. 地下游戏

    2024-07-19 04:50:01       35 阅读
  4. 力扣_动态规划3—地下游戏

    2024-07-19 04:50:01       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 04:50:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 04:50:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 04:50:01       58 阅读
  4. Python语言-面向对象

    2024-07-19 04:50:01       69 阅读

热门阅读

  1. unity C#执行bat文件

    2024-07-19 04:50:01       18 阅读
  2. C语言 分割链表

    2024-07-19 04:50:01       20 阅读
  3. 如何使用Python实现一个简单的Web服务器

    2024-07-19 04:50:01       17 阅读
  4. 微服务重启优化kafka+EurekaNotificationServerListUpdater

    2024-07-19 04:50:01       21 阅读
  5. 降低芯片流片风险的几种方法

    2024-07-19 04:50:01       22 阅读
  6. MySQL 架构中的三层服务是什么?

    2024-07-19 04:50:01       19 阅读
  7. C语言——函数指针

    2024-07-19 04:50:01       17 阅读
  8. 玩转springboot之springboot启动原理

    2024-07-19 04:50:01       21 阅读
  9. Python(字典)

    2024-07-19 04:50:01       22 阅读
  10. 部署和运维

    2024-07-19 04:50:01       15 阅读
  11. junit mockito Base基类

    2024-07-19 04:50:01       20 阅读
  12. 代码随想录-DAY⑩-二叉树——leetcode 144 | 94 | 145

    2024-07-19 04:50:01       21 阅读