174. 地下城遊戲
根據題目中的條件,m*n的網格以及移動路線只能向右或者向下,很容易想到用動態規劃迭代的方法,去依次計算每個網格的情況。
我一開始的想法是從左上角推往右下角,可是在推導中遇到了困難:
首先是發現可能需要兩個輔助陣列來儲存相關資料,乙個是最小初始健康點數,另乙個是當前點數。而這兩個條件的重要程度無法比較,從而無法進行推導。比如:從左邊過來的路徑要求初始最小健康點數比從上面過來的要求初始健康點數少,同時從上面過來的路徑有更多的當前點數。這時兩種選擇會因為後續路徑的不同而各有優劣。
在這個地方我的思路便被卡住了,個人理解以後在遇到動態規劃的問題時,狀態轉移必須是確定的,如果多個條件的重要程度無法比較或者相同,那麼可能得換思路(比如從前往後推導不行試試反方向推導)。
從右下角往左上角推導,則不會遇到複雜的情況。只需要乙個輔助二維陣列,對應位置的儲存內容是:當前位置要抵達重點至少需要的健康點數。推導方法是temp=min(pointsruquest[i+1][j]-d[i][j],pointsruquest[i][j+1]-d[i][j]),pointsrequest[i][j]=max(1,temp)。注意保證抵達當前位置的生命點數大於0即可。
class時間複雜度和空間複雜度都是二維陣列的大小:mnsolution
for(int i=dungeon.size()-1;i>=0;i--)
else
if(i==dungeon.size()-1
)else
if(j==dungeon[0].size()-1
)else
printf(
"(%d,%d):%d\n
",i,j,pointsrequest[i][j]);}}
return pointsrequest[0][0
]; }
};
注意動態規劃問題,如果狀態轉移時遇到兩個無法比較重要程度的條件,可能需要換思路。
174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
174 地下城遊戲
174.地下城遊戲 一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有...
174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...