劍指 Offer 47 禮物的最大價值

2021-10-19 01:58:37 字數 1582 閱讀 7868

在乙個 m*n 的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值(價值大於 0)。你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?

示例 1:

輸入:

[[1,3,1],

[1,5,1],

[4,2,1]

]輸出: 12

解釋: 路徑 1→3→5→2→1 可以拿到最多價值的禮物

提示:0 < grid.length <= 200, 0 < grid[0].length <= 200

這是一道典型的動態規劃題目,我們可以構造一格和輸入矩陣大小相同的動態規劃表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...