乙個戰棋類遊戲,角色只能向右和下兩個方向移動且移動需要消耗體力。遊戲地圖上被分為
m*n個格仔,當角色移動到某個格仔上時,行動力就會加上格仔上的值
k (-100~100)
,當行動力
<=0
時遊戲失敗。求從地圖左上角移動到地圖右下角至少需要多少起始行動力。(玩家初始化到起始的左上角格仔時也需要行動體力)
1)輸入:
第一行,輸入格仔行數和列數(格式為 m n);0 < m, n< 1000
第二行到m+1行,每行輸入n個數作為格仔的k值,中間以空格分隔; -100 < k < 100
2)輸出:
初始最小行動力
3)輸入範例:
2 3-2 -3 3
-5 -10 1 4
)輸出範例:
1)測試1
2 3-2-33
-5 -10 1
答案為6
2)測試2
2 31 -3 1010
-2 答案為1 3
)測試3
2 31-3
10 1 0 -5
答案為3
用動態規劃。設v[k1][k2] 為k值矩陣的元素,dt[k1][k2]表示由(k1, k2)位置到右下角的最小行動力,則該位置的最小行動力由三個因素決定:
1)該位置本身需要的最小行動力1 – v[k1][k2],如論向右還是向下都至少不少於該值
2)到右邊格仔需要的最小行動力,max(1 – v[k1][k2], dt[k1][k2+1]-v[k1][k2])
3)到下邊格仔需要的最小行動力,max(1 – v[k1][k2], dt[k1+1][k2]-v[k1][k2])
該位置的值就是2和3中的最小值(如果都有的話)。
則很顯然有遞推關係:
dt[k1][k2] =min(max(1,dt[k1][k2+1]),max(1,dt[k1+1][k2]))-v[k1][k2];
由於到最後的位置不能沒有體力值。所以初始值dt[m-1][n-1] = 1-v[m-1][n-1]
#include #include #include #include using namespace std;
int minblood(const vector> &v)
int main(int argc, const char * argv)
1631 最小體力消耗路徑
1631.最小體力消耗路徑 你準備參加一場遠足活動。給你乙個二維rows x columns的地圖heights,其中heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從0開始編號 ...
leetCode 最小體力消耗路徑
題目可以轉化為 是否存在一條路徑,該路徑上的體力值不超過x,可以從左上角到達右下角 假設x x0時存在路徑可以從左上角到達右下角,那麼當x增大時原來的路徑仍然可以使用。因此可以使用二分查詢,每次估測乙個x,然後進行廣度或者深度優先搜尋,最後根據能否到達右下角來縮小搜尋範圍。class solutio...
leetcode最小體力消耗路徑
你準備參加一場遠足活動。給你乙個二維 rows x columns 的地圖 heights 其中 heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從 0 開始編號 你每次可以往 上...