在乙個 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 輸出 ...