我是靠谱客的博主 典雅秀发,最近开发中收集的这篇文章主要介绍礼物的最大价值——动态规划,简单易懂礼物的最大价值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

礼物的最大价值

剑指 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];
}
}

最后

以上就是典雅秀发为你收集整理的礼物的最大价值——动态规划,简单易懂礼物的最大价值的全部内容,希望文章能够帮你解决礼物的最大价值——动态规划,简单易懂礼物的最大价值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部