【leetcode】Dungeon Game

Dungeon Game

The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially positioned in the top-left room and must fight his way through the dungeon to rescue the princess.

The knight has an initial health point represented by a positive integer. If at any point his health point drops to 0 or below, he dies immediately.

Some of the rooms are guarded by demons, so the knight loses health (negative integers) upon entering these rooms; other rooms are either empty (0‘s) or contain magic orbs that increase the knight‘s health (positive integers).

In order to reach the princess as quickly as possible, the knight decides to move only rightward or downward in each step.

Write a function to determine the knight‘s minimum initial health so that he is able to rescue the princess.

For example, given the dungeon below, the initial health of the knight must be at least 7 if he follows the optimal path RIGHT-> RIGHT -> DOWN -> DOWN.

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

Notes:

  • The knight‘s health has no upper bound.
  • Any room can contain threats or power-ups, even the first room the knight enters and the bottom-right room where the princess is imprisoned.

从右下角开始进行动态规划

设有m行,n列

考虑边界条件:

最底部的元素:

若dungeon[m-1][n-1]>=0,则

dp[m-1][n-1]=0;

若dungeon[m-1][n-1]<0,则

dp[m-1][n-1]=-dungeon[m-1][n-1];

可以简化为dp[m-1][n-1]=max(-dungeon[m-1][n-1],0);

最右边一列

若dungeon[m-2][n-1]>=0,则

dp[m-2][n-1]=max(dp[m-1][n-1]-dungeon[m-2][n-1],0);

若dungeon[m-2][n-1]<0,则

dp[m-2][n-1]=dp[m-1][n-1]+abs(dungeon[m-2][n-1]);

=dp[m-1][n-1]-dungeon[m-2][n-1];

化简为dp[m-2][n-1]=max(dp[m-1][n-1]-dungeon[m-2][n-1],0);

同理最下边一行

dp[m-1][n-2]=dp[m-1][n-1]-dungeon[m-1][n-2];

对于其他位置的元素

dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])-dungeon,0)

 1 class Solution {
 2 public:
 3     int calculateMinimumHP(vector<vector<int> > &dungeon) {
 4
 5         int m=dungeon.size();
 6         int n=dungeon[0].size();
 7         vector<vector<int>> dp(m,vector<int>(n));
 8
 9         dp[m-1][n-1]=max(-dungeon[m-1][n-1],0);
10
11         for(int i=m-2;i>=0;i--)
12         {
13             dp[i][n-1]=max(dp[i+1][n-1]-dungeon[i][n-1],0);
14         }
15
16         for(int j=n-2;j>=0;j--)
17         {
18             dp[m-1][j]=max(dp[m-1][j+1]-dungeon[m-1][j],0);
19         }
20
21         for(int i=m-2;i>=0;i--)
22         {
23             for(int j=n-2;j>=0;j--)
24             {
25
26                 dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])-dungeon[i][j],0);
27             }
28         }
29
30         return dp[0][0]+1;
31     }
32 };
时间: 2024-10-12 12:18:05

【leetcode】Dungeon Game的相关文章

【LeetCode】Dungeon Game 解题报告【Solution】

[题目] The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially positioned in the top-left room and must fight h

【leetcode】Dungeon Game (middle)

The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially positioned in the top-left room and must fight his wa

【leetcode】Generate Parentheses

题目: 给定整数n,返回n对匹配的小括号字符串数组. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 分析: 这种问题的模式是:1)问题的解有多个 ,2)每个解都是由多个有效的 "步骤" 组成的,3)变更以有解的某个或某些"步骤"

【LeetCode】Implement strStr()

Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 标准KMP算法.可参考下文. http://blog.csdn.net/yaochunnian/article/details/7059486 核心思想在于求出模式串前缀与后缀中重复部分,将重复信息保存在n

【LeetCode】Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

【LeetCode】Pascal&#39;s Triangle

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 这题别想用通项公式做,n choose m里面的连乘必然溢出,老老实实逐层用定义做. class Solution { public: vector<vector<

【LeetCode】Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 思路:第一遍正常复制链表,同时用哈希表保存链表中原始节点和新节点的对应关系,第二遍遍历链表的时候,再复制随机域. 这是一种典型的空间换时间的做法,n个节点,需要大小为O(n

【leetcode】Max Points on a Line (python)

给定一个点,除该点之外的其他所有点中,与该点的关系要么是共线,要么就是共点,也就是两点重合. 共线有三种情况:水平共线,垂直共线,倾斜的共线.合并下这三种情况就是斜率存在的共线和斜率不存在的共线. 那么我们的任务就是针对每个点,找出与其共线的这些情况中,共线最多的点的个数. 注意:最终的结果别忘了加上共点的个数. class Solution: def maxPoints(self, points ): if len( points ) <= 1: return len( points ) ma

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu