题目描述
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快到达公主,骑士决定每次只向右或向下移动一步。
编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。
例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。
-2 (K) -3 3
-5 -10 1
10 30 -5 (P)
说明:
骑士的健康点数没有上限。
任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dungeon-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
白话题目:
向下向右走,遇到整数加血,遇到负数减血,得活着走到右下角。
算法:
逆向思维,最后得剩1血,从下往上走吧;
(1)最开始的dp格里得有 max(1,1-dungeon[row-1][column-1])-------1减去地牢【血量影响值】,保证能活就行
(2)边界的计算也是这个原理max
(3)中间的值就是看下面和右侧的dp值里面最小的,够用就行。
(4)之后这个格子能不能活就看满不满足(1)了。
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int calculateMinimumHP(int** dungeon, int dungeonSize, int* dungeonColSize){
if(dungeonSize==0)
{
return 0;
}
int row=dungeonSize;
int column=*dungeonColSize;
int dp[row][column];
int i;
int j;
for ( i = 0; i < row; i ++)
{
for ( j = 0; j < column; j ++)
{
dp[i][j] = 0;
}
}
dp[row-1][column-1]= max(1,1-dungeon[row-1][column-1]) ;
for(i=column-2;i>=0;i--)
{
dp[row-1][i]=max(1,dp[row-1][i+1]-dungeon[row-1][i]);
}
for(i=row-2;i>=0;i--)
{
dp[i][column-1]=max(1,dp[i+1][column-1]-dungeon[i][column-1]);
}
for(i=row-2;i>=0;i--)
{
for(j=column-2;j>=0;j--)
{
int dp_min=min(dp[i+1][j],dp[i][j+1]);//最少的就行
dp[i][j]=max(1,dp_min-dungeon[i][j]); //保证能活
}
}
return dp[0][0];
}
int main()
{
int dungeonSize;//m
int dungeonColSize;//n
printf("输入m*n大小,例如 (3 3)");
scanf("%d %d",&dungeonSize,&dungeonColSize);
printf("输入矩阵,例如 (-2 -3 3 -5 -10 1 10 30 -5)\n");
int** dungeon=(int**)malloc(sizeof(int*)*dungeonSize);
int m,n;
for ( m = 0; m < dungeonSize; m ++)
{
dungeon[m]=(int*)malloc(sizeof(int)*dungeonColSize);
for ( n = 0; n< dungeonColSize; n ++)
{
scanf("%d",&dungeon[m][n]);
}
}
int result=calculateMinimumHP(dungeon,dungeonSize, &dungeonColSize);
printf("%d\n",result);
return 0;
}