一些惡魔抓住了公主(P)并將她關在了地下城的右下角。地下城是由 M x N 個房間組成的二維網格。我們英勇的騎士(K)最初被安置在左上角的房間里,他必須穿過地下城并通過對抗惡魔來拯救公主。
騎士的初始健康點數為一個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。
有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間里的值為負整數,則表示騎士將損失健康點數);其他房間要么是空的(房間里的值為 0),要么包含增加騎士健康點數的魔法球(若房間里的值為正整數,則表示騎士將增加健康點數)。
為了盡快到達公主,騎士決定每次只向右或向下移動一步。
編寫一個函數來計算確保騎士能夠拯救到公主所需的最低初始健康點數。
例如,考慮到如下布局的地下城,如果騎士遵循最佳路徑 右 -> 右 -> 下 -> 下,則騎士的初始健康點數至少為 7。
-2 -3 3
-5 -10 1
10 30 -5
說明:
騎士的健康點數沒有上限。
任何房間都可能對騎士的健康點數造成威脅,也可能增加騎士的健康點數,包括騎士進入的左上角房間以及公主被監禁的右下角房間。
class Solution {public int calculateMinimumHP(int[][] dungeon) {int n=dungeon.length,m=dungeon[0].length;int[][] dp=new int[n+1][m+1];//數組含義是(i,j)到終點需要的點數for (int i=0;i<=n;i++)//初始化Arrays.fill(dp[i],Integer.MAX_VALUE);dp[n][m-1]=dp[n-1][m]=1;for(int i=n-1;i>=0;i--)//從右下到左上-就是倒著走,還原騎士的路線for(int j=m-1;j>=0;j--)dp[i][j]=Math.max(Math.min(dp[i+1][j],dp[i][j+1])-dungeon[i][j],1);//下一步的兩種走法中所需點數少的那個-當前位置需要改變的點數,如果當前位置加的點數太大,則初始點數只要為1就滿足了return dp[0][0];}
}