湛江网站建设维护,网站源码下载视频,织梦网站密码忘记了,法律建设企业网站本专栏内容为#xff1a;算法学习专栏#xff0c;分为优选算法专栏#xff0c;贪心算法专栏#xff0c;动态规划专栏以及递归#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习#xff0c;你可以了解并掌握算法。 #x1f493;博主csdn个人主页#xff1a;小… 本专栏内容为算法学习专栏分为优选算法专栏贪心算法专栏动态规划专栏以及递归搜索与回溯算法专栏四部分。 通过本专栏的深入学习你可以了解并掌握算法。 博主csdn个人主页小小unicorn ⏩专栏分类动态规划专栏 代码仓库小小unicorn的代码仓库 关注我带你学习编程知识 专题二 题目来源题目描述算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现 题目来源
本题来源为 Leetcode 174. 地下城游戏 题目描述
恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下他会立即死亡。
有些房间由恶魔守卫因此骑士在进入这些房间时会失去健康点数若房间里的值为负整数则表示骑士将损失健康点数其他房间要么是空的房间里的值为 0要么包含增加骑士健康点数的魔法球若房间里的值为正整数则表示骑士将增加健康点数。
为了尽快解救公主骑士决定每次只 向右 或 向下 移动一步。
返回确保骑士能够拯救到公主所需的最低初始健康点数。
算法原理
1.状态表示
经验题目要求
对于本题而言就是
dp[i][j]表示从[i,j]位置的出发到达终点所需要的最低初始健康点数
2.状态转移方程
分两种情况
因此状态方程为 为什么最后还要和1取Max呢这是为了防止最后结果是个负数
dp[i][j]min(dp[i1][j],dp[i][j1])-d[i][j];
dp[i][j]max(1,dp[i][j]);3.初始化
看图分析很容易就知道应该如何初始化。 4.填表顺序
从下往上填每一行每一行从右往左
5.返回值
dp[0][0]
代码实现
动态规划的代码基本就是固定的四步
1.创建dp表
2.初始化
3.填表
4.返回值本题完整代码实现
class Solution
{
public:int calculateMinimumHP(vectorvectorint d) {int md.size(),nd[0].size();//创建dp表vectorvectorint dp(m1,vectorint(n1,INT_MAX));//初始化dp[m][n-1]dp[m-1][n]1;//填表for(int im-1;i0;i--){for(int jn-1;j0;j--){//状态转移方程dp[i][j]min(dp[i1][j],dp[i][j1])-d[i][j];dp[i][j]max(1,dp[i][j]);}}return dp[0][0];}
};时间复杂度O(MxN) 空间复杂度O(MxN)