当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)47.礼物的最大价值

题目描述

在一个 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 <= 200

测试用例

  • 功能测试(多行多列的矩阵;一行或者一列的矩阵;只有一个数字的矩阵)
  • 特殊输入测试(指向矩阵数组的指针为空指针)

题目考点

  • 考察应聘者用动态规划分析问题的能力。
  • 考察应聘者对递归及时间效率的理解。需要我们利用动态规划来减少重复计算。

解题思路

首先我们要找出递归式:

f(i,j) = max(f(i-1,j),f(i,j-1)) + gift[i,j]

所以我们可能会马上用递归做出来(见自己解题),但是这种方法会有大量的重复计算,导致递归的代码不是最优的,所以我们考虑用动态规划(循环)来做。

我们需要一个二维数组,数组中坐标为(i,j)的元素表示到达坐标(i,j)的格子时能拿到的礼物价值总和的最大值。

代码见参考解题。

参考解题

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        for(int j = 1; j < n; j++) // 初始化第一行
            grid[0][j] += grid[0][j - 1];
        for(int i = 1; i < m; i++) // 初始化第一列
            grid[i][0] += grid[i - 1][0];
        for(int i = 1; i < m; i++)
            for(int j = 1; j < n; j++) 
                grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][j]);
        return grid[m - 1][n - 1];
    }
}
class Solution {
    public int maxValue(int[][] grid) {
        int row = grid.length;
        int column = grid[0].length;
        //dp[i][j]表示从grid[0][0]到grid[i - 1][j - 1]时的最大价值
        int[][] dp = new int[row + 1][column + 1];
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= column; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }
        return dp[row][column];
    }
}

相关文章:

  • 剑指Offer系列(java版,详细解析)48.最长不含重复字符的子字符串
  • 剑指Offer系列(java版,详细解析)49.丑数
  • 剑指Offer系列(java版,详细解析)50.第一个只出现一次的字符
  • 剑指Offer系列(java版,详细解析)51.数组中的逆序对
  • 剑指Offer系列(java版,详细解析)52.两个链表的第一个公共节点
  • 剑指Offer系列(java版,详细解析)53.在排序数组中查找数字
  • 剑指Offer系列(java版,详细解析)54.二叉搜索树的第K大的节点
  • 剑指Offer系列(java版,详细解析)55.二叉树的深度
  • 剑指Offer系列(java版,详细解析)56.数字中数字出现的次数
  • 剑指Offer系列(java版,详细解析)57.和为s的数字
  • 剑指Offer系列(java版,详细解析)58.翻转字符串
  • 剑指Offer系列(java版,详细解析)59.队列的最大值
  • 剑指Offer系列(java版,详细解析)60.n个骰子的点数
  • 剑指Offer系列(java版,详细解析)61.扑克牌中的顺子
  • 剑指Offer系列(java版,详细解析)62.圆圈中最后剩下的数字
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Apache的基本使用
  • ComponentOne 2017 V2版本正式发布
  • HashMap剖析之内部结构
  • js如何打印object对象
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PHP变量
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Terraform入门 - 1. 安装Terraform
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 大快搜索数据爬虫技术实例安装教学篇
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 浮动相关
  • 关于使用markdown的方法(引自CSDN教程)
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 使用Swoole加速Laravel(正式环境中)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #Z0458. 树的中心2
  • (1)(1.9) MSP (version 4.2)
  • (33)STM32——485实验笔记
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)fread与fwrite详解
  • (C语言)二分查找 超详细
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net mvc 获取url中controller和action
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • :=
  • @AutoConfigurationPackage的使用
  • @Builder用法
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [20190416]完善shared latch测试脚本2.txt