在乙個 m*n 的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值(價值大於 0)。你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?
示例 1:
輸入:提示:0 < grid.length <= 200, 0 < grid[0].length <= 200[[1,3,1],
[1,5,1],
[4,2,1]
]輸出: 12
解釋: 路徑 1→3→5→2→1 可以拿到最多價值的禮物
這是一道典型的動態規劃題目,我們可以構造一格和輸入矩陣大小相同的動態規劃表dp[m] [n], 這個dp表每個座標代表從左上角到當前位置所能獲得的最大價值
對於第一行的元素,均是向右走得到的
對於其他任意位置的狀態轉移方程為:
最後dp表左下角的值即為所求
示例:
class
solution
:def
maxvalue
(self, grid: list[list[
int]])
->
int:
# 動態規劃
# 構建動態規劃二維陣列
# 對於一般位置的狀態轉移方程為:dp(i, j) = max(dp(i-1, j), dp(i, j-1))+grid(i, j)
# 初始化,考慮原點,第一行,第一列
# dp(0, 0) = grid(0, 0)原點只能為原點值
# dp(i, 0) = dp(i-1, 0)+grid(i, 0)第一行只能是由左邊dp值計算而來
# dp(0, j) = dp(0, j-1)+grid(0, j)第一列只能由上乙個dp值計算而來
m, n =
len(grid)
,len
(grid[0]
) dp =[[
0]*n for _ in
range
(m)]
for i in
range
(m):
for j in
range
(n):
if i==
0and j==
0:dp[i]
[j]= grid[i]
[j]elif i==
0:dp[i]
[j]= dp[i]
[j-1
]+ grid[i]
[j]elif j==
0:dp[i]
[j]= dp[i-1]
[j]+ grid[i]
[j]else
: dp[i]
[j]=
max(dp[i-1]
[j], dp[i]
[j-1])
+ grid[i]
[j]return dp[m-1]
[n-1
]
劍指offer 47 禮物的最大價值
題目描述 在乙個 m n 的棋盤的每乙個格都放有乙個禮物,每個禮物都有一定價值 大於 0 從左上角開始拿禮物,每次向右或向下移動一格,直到右下角結束。給定乙個棋盤,求拿到禮物的最大價值。例如,對於如下棋盤 1 10 3 8 12 2 9 6 5 7 4 11 3 7 16 5 禮物的最大價值為 1 ...
劍指offer 47 禮物的最大價值
在乙個m x n的棋盤的每乙個字都放有乙個禮物,每個禮物都有一定的價值 價值大於0 可以從棋盤的左上角開始拿格仔裡的禮物,並每次向左或向下移動一格,直到到達棋盤的右下角。給定乙個棋盤及棋盤上面的禮物,計算出最多能拿到多少價值的禮物。首先定義乙個函式f i,j 表示到達座標為 i,j 時能拿到禮物的總...
劍指offer47 禮物的最大價值
題目描述 在乙個 m n 的棋盤的每乙個格都放有乙個禮物,每個禮物都有一定價值 大於 0 從左上角開始拿禮物,每次向右或向下移動一格,直到右下角結束。給定乙個棋盤,求拿到禮物的最大價值。例如,對於如下棋盤 1 10 3 8 12 2 9 6 5 7 4 11 3 7 16 5 思路 動態規劃 狀態d...