【千字分析】剑指 Offer 47. 礼物的最大价值
我是小張同學(xué),立志用更簡(jiǎn)潔的代碼做更高效的表達(dá)
在一個(gè) m*n 的棋盤(pán)的每一格都放有一個(gè)禮物,每個(gè)禮物都有一定的價(jià)值(價(jià)值大于 0)。你可以從棋盤(pán)的左上角開(kāi)始拿格子里的禮物,并每次向右或者向下移動(dòng)一格、直到到達(dá)棋盤(pán)的右下角。給定一個(gè)棋盤(pán)及其上面的禮物的價(jià)值,請(qǐng)計(jì)算你最多能拿到多少價(jià)值的禮物?
示例 1:
?
輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 12
解釋: 路徑 1→3→5→2→1 可以拿到最多價(jià)值的禮物
提示:
?
0 < grid.length <= 200
0 < grid[0].length <= 200
動(dòng)態(tài)規(guī)劃(二維):
第一時(shí)間想到二維dp數(shù)組,其中dp[i][j]為到第i行第j列時(shí)可獲得的最大價(jià)值。
第i行第j列的最大價(jià)值(dp[i][j])可以為:
- 左邊一格的最大價(jià)值(dp[i][j - 1])加目前格子(grid[i][j])
- 上面一格的最大價(jià)值(dp[i - 1][j])加目前格子(grid[i][j])
那么轉(zhuǎn)移方程為:
dp[i][j]=max(dp[i?1][j],dp[i][j?1])+grid[i][j]dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]dp[i][j]=max(dp[i?1][j],dp[i][j?1])+grid[i][j]
考慮邊界情況:
- i == 0, j == 0, 最左上角直接為格子本身(grid[i][j])
- i == 0, j != 0, 第一行沒(méi)有上面格子只能是左邊一格的最大價(jià)值(dp[i][j - 1])加目前格子(grid[i][j])
- i != 0, j == 0, 第一列沒(méi)有左邊格子只能是上面一格的最大價(jià)值(dp[i - 1][j])加目前格子(grid[i][j])
總結(jié)
以上是生活随笔為你收集整理的【千字分析】剑指 Offer 47. 礼物的最大价值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【千字分析】剑指 Offer 46. 把
- 下一篇: 【终极方法】解决IDEA搜索不到Lomb