(动态规划) 剑指 Offer 47. 礼物的最大价值 ——【Leetcode每日一题】

❓ 剑指 Offer 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

💡思路:动态规划

应该用动态规划求解,而不是深度优先搜索,深度优先搜索过于复杂,不是最优解。

从棋盘的左上角开始拿格子里的礼物,并每次 向右 或者 向下 移动一格、直到到达棋盘的右下角。 根据题目说明,易得某单元格只可能从上边单元格或左边单元格到达。

dp[i,j] 为从棋盘左上角走至单元格 [i,j] 的礼物最大累计价值,易得到以下递推关系:dp[i,j] 等于 dp[i,j−1]dp[i−1,j] 中的较大值加上当前单元格礼物价值 grid[i,j] ,状态转移方程为:

d p [ i , j ] = { g r i d [ i , j ] , i = 0 , j = 0 g r i d [ i , j ] + d p [ i , j − 1 ] , i = 0 , j ≠ 0 g r i d [ i , j ] + d p [ i − 1 , j ] , i ≠ 0 , j = 0 g r i d [ i , j ] + max ⁡ ( d p [ i − 1 , j ] , d p [ i , j − 1 ] ) , i ≠ 0 , j ≠ 0 ​ dp[i,j]=\begin{cases}grid[i,j]&,i=0,j=0\\grid[i,j]+dp[i,j-1]&,i=0,j\neq0\\grid[i,j]+dp[i-1,j]&,i\neq0,j=0\\grid[i,j]+\max(dp[i-1,j],dp[i,j-1])&,i\neq0,j\neq0\end{cases} ​ dp[i,j]= grid[i,j]grid[i,j]+dp[i,j1]grid[i,j]+dp[i1,j]grid[i,j]+max(dp[i1,j],dp[i,j1]),i=0,j=0,i=0,j=0,i=0,j=0,i=0,j=0

空间优化

  • 由于 dp[i][j]只与 dp[i−1][j] , dp[i][j−1] , grid[i][j]有关系,因此可以将原矩阵 grid用作 dp 矩阵,即直接在 grid 上修改即可。
  • 应用此方法可省去 dp 矩阵使用的额外空间,因此空间复杂度从 O ( m n ) O(mn) O(mn) 降至 O ( 1 ) O(1) O(1)

🍁代码:(C++、Java)

C++

class Solution {
public:int maxValue(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();for(int i = 1; i < m; i++){ // 先处理第一行grid[i][0] += grid[i - 1][0];}for(int i = 1; i < n; i++){  //处理第一行列grid[0][i] += grid[0][i - 1];}for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){grid[i][j] += max(grid[i - 1][j], grid[i][j - 1]);}}return grid[m - 1][n - 1];}
};

Java

class Solution {public int maxValue(int[][] grid) {int m = grid.length, n = grid[0].length;for(int i = 1; i < m; i++){//先处理第一行grid[i][0] += grid[i - 1][0];}for(int i = 1; i < n; i++){//处理第一列grid[0][i] += grid[0][i - 1];}for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){grid[i][j] += Math.max(grid[i - 1][j], grid[i][j - 1]);}}return grid[m - 1][n - 1];}
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( m n ) O(mn) O(mn),其中 mn 分别为二维数组 grid 的行高、列宽,动态规划需遍历整个 grid
  • 空间复杂度 O ( 1 ) O(1) O(1),原地修改使用常数大小的额外空间。。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/82073.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#写的端口监听,程序退出后,再次运行提示端口占用,且进程不存在

我用c#写了一个监听29999端口,进程结束后再次启动发现端口被占用&#xff0c;但是运行netstat -ano | findstr 29999找到进程ID后&#xff0c;却没有这个进程 经查询这个监听29999进程虽然没了&#xff0c;但是要找到他的父进程&#xff0c;把父进程关闭了才可以&#xff0c;参…

【C++】—— C++11新特性之 “右值引用和移动语义”

前言&#xff1a; 本期&#xff0c;我们将要的介绍有关 C右值引用 的相关知识。对于本期知识内容&#xff0c;大家是必须要能够掌握的&#xff0c;在面试中是属于重点考察对象。 目录 &#xff08;一&#xff09;左值引用和右值引用 1、什么是左值&#xff1f;什么是左值引用…

DOS常见命令

DOS常见命令 DOS是什么如何打开DOScmd常见的命令集合 DOS是什么 DOC命令是我们浏览器中的终端 &#xff0c;但不同的是我们打开软件的方式 使用的是点击文件图标&#xff0c;点击图标的同时 我们也相当于使用一个命令 只是我们看不见而已 在电脑上操作的时候 通常都是使用命令…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。

一.根据自己版本选择镜像 uname -a cat /etc/centos-releaseuname -a 命令用于查看当前系统的硬件和操作系统信息&#xff0c;包括内核版本、处理器架构、系统类型等。 其中&#xff0c;"Linux" 表示操作系统类型为 Linux&#xff0c;"3.10.0-1160.el7.x86_64…

【ROS】参数服务器--理论模型与参数操作(C++)

一、概念介绍 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 作用&#xff1a;存储一些多节点…

在 Pytorch 中使用 TensorBoard

机器学习的训练过程中会产生各类数据&#xff0c;包括 “标量scalar”、“图像image”、“统计图diagram”、“视频video”、“音频audio”、“文本text”、“嵌入Embedding” 等等。为了更好地追踪和分析这些数据&#xff0c;许多可视化工具应运而生&#xff0c;比如之前介绍的…

字节一面:post为什么会发送两次请求?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;因为在前端开发的日常开发中我们总是会与post请求打交道&#xff0c;一个小小的post请求也是牵扯到很多知识点的&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…

【校招VIP】CSS校招考点之水平/垂直居中

考点介绍&#xff1a; 前端布局非常重要的一环就是页面框架的搭建&#xff0c;也是最基础的一环。在页面框架搭建之中&#xff0c;又有居中布局/多列布局/全局布局。今天介绍一下居中布局的水平居中和垂直居中。 『CSS校招考点之水平/垂直居中』相关题目及解析内容可点击文章末…

FPGA应用于图像处理

FPGA应用于图像处理 FPGA&#xff08;Field-Programmable Gate Array&#xff09;直译过来就是现场可编程门阵列。是一种可以编程的逻辑器件&#xff0c;具有高度的灵活性&#xff0c;可以根据具体需求就像编程来实现不同的功能。 FPGA器件属于专用的集成电流中的一种半定制电…

Me-and-My-Girlfriend靶场

靶机下载&#xff1a; https://www.vulnhub.com/entry/me-and-my-girlfriend-1,409/ 一、信息收集 查找ip nmap -sP 192.168.16.0/24获取详细端口等信息 nmap -sV -sC -A -p 1-65535 192.168.16.209目录扫描 gobuster dir -u http://192.168.16.209 -w /usr/share/word…

ARM-汇编指令

一&#xff0c;map.lds文件 链接脚本文件 作用&#xff1a;给编译器进行使用&#xff0c;告诉编译器各个段&#xff0c;如何进行分布 /*输出格式&#xff1a;32位可执行程序&#xff0c;小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…