劍指 Offer 47. 禮物的最大價值

劍指 Offer 47. 禮物的最大價值

難度中等250 收藏 分享 切換為英文 接收動態(tài) 反饋

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

示例 1:

<pre style="box-sizing: border-box; font-size: 13px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; margin-top: 0px; margin-bottom: 1em; overflow: auto; background: rgba(var(--dsw-fill-tertiary-rgb),1); padding: 10px 15px; color: rgba(var(--grey-9-rgb),1); line-height: 1.6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: pre-wrap;">輸入:
[ [1,3,1], [1,5,1], [4,2,1] ]
輸出: 12 解釋: 路徑 1→3→5→2→1 可以拿到最多價值的禮物</pre>

提示:

  • 0 < grid.length <= 200
  • 0 < grid[0].length <= 200

思路:
動態(tài)規(guī)劃
需要求的右下角的最大值
先計算第一排和第一列的每個格子的最大值,
a[row][0]=a[row-1][0]+nums[row][0];
然后剩下的格子a[row][column]的最大值是max(a[row-1][column],a[row][column])+nums[row][column]
最后返回右下角的最大值就ok了

class Solution {
public int maxValue(int[][] grid) {
int rows=grid.length;
int columns=grid[0].length;
int[][] dp= new int[rows][columns];
dp[0][0]=grid[0][0];
for(int column=1;column<columns;column++){
dp[0][column]=dp[0][column-1]+grid[0][column];
}
for(int row=1;row<rows;row++){
dp[row][0]=dp[row-1][0]+grid[row][0];
}
for(int column=1;column<columns;column++){
for(int row=1;row<rows;row++){
dp[row][column]=Math.max(dp[row-1][column]+grid[row][column],dp[row][column-1]+grid[row][column]);
}
}
return dp[rows-1][columns-1];
}
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容