概述
礼物的最大价值
剑指 Offer 47. 礼物的最大价值
☑️ 新的一天加油,你肯定可以看懂的,相信自己???? ???? ????
难度中等273
♨️在一个 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 <= 20
⛲重点交代了
✈️每次向右或者向下移动一格、直到到达棋盘的右下角。
❤️思想:这道题使用的是动规,只要找出核心方程就可以了,求第几行第几列元素(dp[i] [j]) 它的礼物 最大价值,其实就是求左边或者上一行的最大价值,所以是往前看。
❤️ ✨⭐所以核心方程是:
dp[i][j]=grid[i][j];
// i==0&&j==0
dp[i][j]=grid[i][j]+dp[i][j-1];
//
i==0&&j!=0
第一排的只能来自前面一个
dp[i][j]=grid[i][j]+dp[i-1][j];
//
i!=0&&j==0
第一列的只能来自上面一行
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+grid[i][j];
// //i!=0&&j!=0 剩下的就看左边和上面的元素哪个最大值+当前礼物
代码:
public class 礼物的最大价值 {
public int maxValue(int[][] grid) {
int n=grid.length;
int m=grid[0].length;
int[][] dp = new int[n][m];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (i==0&&j==0){
dp[i][j]=grid[i][j];
}else if (i==0&&j!=0){
//第一排的只能来自前面一个
dp[i][j]=grid[i][j]+dp[i][j-1];
}else if (i!=0&&j==0){
//第一列的只能来自上面一排
dp[i][j]=grid[i][j]+dp[i-1][j];
}else {
//i!=0 &&j!=0
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
}
return dp[n-1][m-1];
}
}
最后
以上就是典雅秀发为你收集整理的礼物的最大价值——动态规划,简单易懂礼物的最大价值的全部内容,希望文章能够帮你解决礼物的最大价值——动态规划,简单易懂礼物的最大价值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复