zoukankan      html  css  js  c++  java
  • 【leetcode dp】Dungeon Game

    https://leetcode.com/problems/dungeon-game/description/

    【题意】

    给定m*n的地牢,王子初始位置在左上角,公主在右下角不动,王子要去救公主,每步只能往右或往下走一格。每个格子是一个整数,负数代表生命值减掉相应分数,正数表示生命值增加相应分值,要保证王子在走的过程中不挂掉,即经过每个格子后的生命值大于等于1,问王子最初的生命值最少是多少。

    【思路】

    倒着推dp,计算(i,j)->(m,n)的可生存血量。

    dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-a[i][j]]);

    【AC】

     1 class Solution {
     2 public:
     3     int calculateMinimumHP(vector<vector<int>>& dungeon) {
     4         int m=dungeon.size();
     5         int n=dungeon[0].size();
     6         const int inf=0x3f3f3f3f;
     7         vector<vector<int> > dp(m+1,vector<int>(n+1));
     8         for(int i=0;i<=m;i++){
     9             for(int j=0;j<=n;j++){
    10                 dp[i][j]=inf;
    11             }
    12         }
    13         dp[m-1][n-1]=max(1,1-dungeon[m-1][n-1]);
    14         for(int k=m+n-3;k>=0;k--){
    15             for(int i=0;i<m;i++){
    16                 int j=k-i;
    17                 if(j<0||j>=n) continue;
    18                 dp[i][j]=max(1,min(dp[i][j+1],dp[i+1][j])-dungeon[i][j]);
    19             }
    20         }
    21         return dp[0][0];
    22     }
    23 };
    View Code
  • 相关阅读:
    软件工程个人作业01
    阅读计划及浅读问题
    引言作业1
    多态和异常分析课后
    大道至简七八章阅读
    接口与继承 课后实践
    构建执法阅读笔记02
    冲刺第五天
    学习进度条七
    冲刺第四天
  • 原文地址:https://www.cnblogs.com/itcsl/p/8994853.html
Copyright © 2011-2022 走看看