动态规划:礼物的最大价值

举报
陈皮的JavaLib 发表于 2021/06/09 22:25:15 2021/06/09
【摘要】 package com.nobody; /** * 题目: * 礼物的最大价值 * 描述: * 在一个 m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。 * 你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋 * 盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? * ...
package com.nobody;

/**
 * 题目:
 * 礼物的最大价值
 * 描述:
 * 在一个 m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。
 * 你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋
 * 盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
 * 示例:
 * 输入:
 * [
 * [1,3,1],
 * [1,5,1],
 * [4,2,1]
 * ]
 * 输出: 12
 * 路径 1→3→5→2→1
 * @author Μr.ηobοdy
 *
 * @date 2020-03-29
 *
 */
public class MaxValue { // 动态规划 // 假设dp[row][col]是走到[row][col]位置时的最大价值 // 走到[row][col]位置有2种情况,一种为从[row][col-1]位置往右走,一种为从[row-1][col]位置往下走 // 数组的第0行每一个位置只能从左边走过来,第0列每一个位置只能从上边走过来,故可以优先初始化处理 public int maxValue(int[][] grid) { int rows = grid.length; int cols = grid[0].length; int[][] dp = new int[rows][cols]; dp[0][0] = grid[0][0]; // 处理第0行 for (int col = 1; col < cols; col++) { dp[0][col] = dp[0][col-1] + grid[0][col]; } // 处理第0列 for (int row = 1; row < rows; row++) { dp[row][0] = dp[row-1][0] + grid[row][0]; } // 处理其他行列 for (int row = 1; row < rows; row++) { for (int col = 1; col < cols; col++) { dp[row][col] = Math.max(dp[row][col-1], dp[row-1][col]) + grid[row][col]; } } return dp[rows-1][cols-1]; } // 动态规划,优化版 // 走到[row][col]位置有2种情况,一种为从[row][col-1]位置往右走,一种为从[row-1][col]位置往下走 // 故row-2行以上的数据没有必要保存下来,使用一维数组maxValues[cols]保存: // maxValues[0]到maxValues[col-1]保存当前行0到col-1列的最大价值 // maxValues[col]到maxValues[cols-1]保存上一行col列到cols-1列的最大价值 // 计算grid[row][col]当前位置的最大价值后,将最大价值值存入maxValues[col]中 public int maxValue1(int[][] grid) { int rows = grid.length; int cols = grid[0].length; int[] maxValues = new int[cols]; // 记录当前位置左边位置的最大价值 int leftMaxValue = 0; // 记录当前位置上边位置的最大价值 int upMaxValue = 0; // 遍历每一个位置 for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { leftMaxValue = 0; upMaxValue = 0; if (row > 0) { upMaxValue = maxValues[col]; } if (col > 0) { leftMaxValue = maxValues[col-1]; } maxValues[col] = Math.max(upMaxValue, leftMaxValue) + grid[row][col]; } } return maxValues[cols-1]; }

}

文章来源: javalib.blog.csdn.net,作者:陈皮的JavaLib,版权归原作者所有,如需转载,请联系作者。

原文链接:javalib.blog.csdn.net/article/details/105172545

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。