Skip to content

Latest commit

 

History

History
 
 

174.Dungeon-Game

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

174.Dungeon-Game

我们会想dp[i][j]表示从(i,j)的位置上出发(注意,已经survive from (i,j)本身)的时候,需要多少血才能走到终点?显然有两条路。其中一条通过(i+1,j)走到终点,这样我们需要在出发的时候至少有-dugeon[i+1][j]的血才能活着走到(i+1,j),然后再利用dp[i+1][j]的血量保证能继续走到终点。

第二路通过(i,j+1)走到终点,这样我们需要在出发的时候至少有-dugeon[i][j+1]的血才能活着走到(i,j+1),然后再利用dp[i][j+1]的血量保证能继续走到终点。

既然这两条路都能走到终点,那从(i,j)出发到底需要准备多少血量就够了呢?自然是两者的较小值:

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

特别注意的是,dp[i][j]还必须大于等于1,要保证从(i,j)出发的时候人必须还是活着的。也就是说,即使下一个cell有很大的补药,也不允许在本cell先欠着命再在后面靠补药续上。这个补丁很重要。

dp[i][j] = max(dp[i][j], 1); 

从这个动态转移方程的表达式可以看出,这是个从右下角往左上角计算的过程。初始状态是dp[m-1][n-1]=1。最终得到的d[0][0]的意义是:survive from (0,0)之后需要存留多少血才能走到终点。因此我们还需要再额外处理一次(0,0)位置的损血代价。

Leetcode Link