動態規劃 47題 禮物的最大價值

2021-10-25 14:28:58 字數 1551 閱讀 5170

在乙個 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

題目說明:從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。

根據題目說明,易得某單元格只能從上邊單元格或左邊單元格到達。

設f (i

,j)f(i,j)

f(i,j)

為從棋盤左上角走至單元格(i,j)的禮物最大累積價值,易得到以下遞推關係:f(i

,j)f(i,j)

f(i,j)

等於f (i

,j−1

)f(i,j-1)

f(i,j−

1)和f (i

−1,j

)f(i-1,j)

f(i−1,

j)中的較大值加上當前單元格禮物價值gri

d(i,

j)grid(i,j)

grid(i

,j)。

f (i

,j)=

max[

f(i,

j−1)

,f(i

−1,j

)]+g

rid(

i,j)

f(i,j)=max[f(i,j-1),f(i-1,j)]+grid(i,j)

f(i,j)

=max

[f(i

,j−1

),f(

i−1,

j)]+

grid

(i,j

)因此,可用動態規劃解決此問題,以上公式便為轉移方程。

動態規劃解析:

初始狀態:dp[0][0]=grid[0][0],即到達單元格(0,0)時能拿到禮物的最大累積價值為grid[0][0];

返回值:dp[m-1][n-1],m,n分別為矩陣的行高和列寬,即返回dp矩陣右下角元素。

空間複雜度優化:

class

solution

}return grid[m-1]

[n-1];

}}

複雜度分析:

47 禮物的最大價值

在乙個 m n 的棋盤中的每乙個格都放乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿各種裡的禮物,並每次向由或者向下移動一格,直到到達棋盤的右下角。給定乙個棋盤及上面個的禮物,請計算你最多能拿走多少價值的禮物?可以通過動態規劃的思想實現。定義陣列a,a i j 表示到達 i...

47 禮物的最大價值

在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格 直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?示例 1 輸入 1,3,1 1,5,1 4,2,1 輸出 12 ...

劍指offer 47(動態規劃)禮物的最大價值

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