Dungeon Game | leetcode 解题思路
2015-01-19 21:42
477 查看
此题可以使用动态规划的方法求解,关键在于如何定义问题的状态。此题的状态可以这样定义,dp[i][j]代表从格子[i][j]到终点(公主所在位置)所需要的最小健康值,那么递推方程可以定义为dp[i][j]=max{min{dp[i+1][j],dp[i][j+1]}-dungeon[i][j],0},其中,dungeon[i][j]代表骑士经过此方格所获得的健康值,含义是:此方格所需要的最小健康值等于向右走最小健康值和向最小健康值中较小的减去骑士在此方格中所获得的健康值,并且dp[i][j]最小值为0。此递推方程满足最优子结构的性质。那么最终的实现就比较简单了。
AC代码:
AC代码:
int calculateMinimumHP(vector<vector<int> > &dungeon){ int m=dungeon.size(); int n=dungeon[0].size(); vector<vector<int> >dp(m+1,vector<int>(n+1,0)); for(int j=n-1;j>=0;j--){ dp[m-1][j]=max(dp[m-1][j+1]-dungeon[m-1][j],0); } for(int i=m-1;i>=0;i--){ dp[i][n-1]=max(dp[i+1][n-1]-dungeon[i][n-1],0); } for(int i=m-2;i>=0;i--){ for(int j=n-2;j>=0;j--){ dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])-dungeon[i][j],0); } } return dp[0][0]+1; }
相关文章推荐
- LeetCode解题思路之Maximum Distance in Arrays
- leetCode 98.Validate Binary Search Tree (有效二叉搜索树) 解题思路和方法
- leetCode 108.Convert Sorted Array to Binary Search Tree(将排序数组转换为BST) 解题思路和方法
- leetCode 21.Merge Two Sorted Lists (合并排序链表) 解题思路和方法
- LeetCode Weekly Contest 46解题思路
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
- leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法
- leetcode之Pascal's Triangle I 和 II 解题思路
- leetCode 64.Minimum Path Sum (最短路) 解题思路和方法
- leetcode 之 Two Sum 解题思路
- leetCode 85.Maximal Rectangle (最大矩阵) 解题思路和方法
- leetCode 61.Rotate List (旋转链表) 解题思路和方法
- leetCode 93.Restore IP Addresses (恢复IP地址) 解题思路和方法
- leetCode 99.Recover Binary Search Tree(修正二叉搜索树) 解题思路和方法
- [LeetCode] 76. Minimum Window Substring 解题思路
- LeetCode Weekly Contest 32解题思路
- LeetCode - 459. Repeated Substring Pattern - O(n)和O(n^2)两种思路 - KMP - (C++) - 解题报告
- leetCode 85.Maximal Rectangle (最大矩阵) 解题思路和方法
- [LeetCode] Search in Rotated Sorted Array I (33) && II (81) 解题思路
- leetCode 13.Roman to Integer (罗马数字转整形) 解题思路和方法