面試OR筆試14 最小體力值

2021-08-07 11:44:04 字數 1193 閱讀 4219

乙個戰棋類遊戲,角色只能向右和下兩個方向移動且移動需要消耗體力。遊戲地圖上被分為

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 開始編號 你每次可以往 上...