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

news2024/9/25 23:21:24

❓ 剑指 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.coloradmin.cn/o/921680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【应用层】网络基础 -- HTTP协议

再谈协议HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见HeaderHTTP周边会话保持 再谈协议 协议是一种 “约定”. socket api的接口&#xff0c;在读写数据时&#xff0c;都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的&am…

排序—数据结构

文章目录 1.前置知识1.1稳定性1.2内部排序和外部排序1.3是不是比较的排序 2.直接插入排序2.1思想2.2实现2.3时间复杂度和空间复杂度、稳定性 3.希尔排序3.1思想3.2实现3.3时间复杂度和空间复杂度、稳定性 4.选择排序4.1思想4.2实现4.3时间复杂度和空间复杂度、稳定性 5.堆排序5…

基于卷积神经网络的种子等级识别

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期神经网络语音识别系统…

【python零基础入门学习】python基础篇(一)

python基础学习 官方: www.python.org&#xff0c;自行安装&#xff0c;linux上有自带python&#xff0c;win自行安装。 [studentroom9pc01 05]$ python --version Python 2.7.5 #创建虚拟环境&#xff1a; [rootroom9pc01 bin]# pwd /root/nsd1907/bin [rootroom9pc01 bin]…

高质量编程与性能调优实践 性能分析工具pprof

01 高质量编程 1.1 简介 什么是高质量 ——编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码 • 各种边界条件是否考虑完备 • 异常情况处理&#xff0c;稳定性保证 • 易读易维护 编程原则 实际应用场景千变万化&#xff0c;各种语言的特性和语法各不相同 但是高…

1267. 统计参与通信的服务器

这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务…

浪涌保护器防雷应用的行业解决方案

浪涌保护器SPD是一种用于防止电力系统或电子设备受到雷击或其他暂态过电压的损坏的装置。它可以有效地限制或分流过电压&#xff0c;保护被保护设备的安全和正常运行。浪涌保护器在各个行业领域都有广泛的应用&#xff0c;地凯科技将介绍浪涌保护器的主要应用领域&#xff0c;以…

threejs纹理加载(二)

通过threejs提供的加载器我们去加载一些贴图作为几何体的纹理&#xff0c;非常方便。我们以本地一张图片作为例子来实现这个效果&#xff1a; <template><div></div> </template> <script setup> import { ref } from "vue";import …

C++ 编译报错“jump to label”

C 编译报错“jump to label” 分析解决方法如何在Eclipse中添加编译选项 分析 void func() {int a 0;a;goto label; label:int b 0;return; }这样的代码是有问题的&#xff0c;因为C编译规则中&#xff0c;不允许goto后面还有新的变量声明。 解决方法 将所有变量声明放到第…

LTD240次升级 | 栏目介绍可在官微中心管理 • 移动分享页可显示产品图文参数

1、新增一种自定义内容数据类型&#xff0c;可用于服务特色等版块展示 2、Android版App优化首页内容排序 3、新增一款导航模块和一款轮播模块 4、移动分享页支持产品图文参数 5、已知问题修复与优化 01 官微中心 1) 新增自定义内容类型数据管理功能 本次升级中&#xff0c;新…

卡尔曼滤波学习笔记

Kalman Filter Ⅰ、直观理解1、描述2、例子 Ⅱ、适用范围1、线性系统2、噪声服从高斯分布 Ⅲ、相关公式1、原始公式2、预测公式3、更新公式4、初值赋予5、总结 Ⅳ、应用例子Ⅴ、代码实现Ⅵ、公式理解1、协方差矩阵的理解1.1 协方差1.2 协方差矩阵1.3、相关数学公式 2、状态方程…

实例043 如何实现Office助手

实例说明 用过Office的人都知道&#xff0c;Office助手是一个非常漂亮的小工具&#xff0c;有了它&#xff0c;即使对Office不太熟悉的用户也可以操作自如。本实例使用C#制作了一个类似Office助手的程序&#xff0c;实例效果如图1.44所示。 技术要点 要实现Office助手效果&a…

2023年Java毕业设计题目推荐,怎样选题?500道毕业设计题目推荐

大家好&#xff0c;我是程序员徐师兄&#xff0c;最近有很多同学咨询&#xff0c;说毕业设计了&#xff0c;不知道选怎么题目好&#xff0c;有哪些是想需要注意的。 今天&#xff0c;我整理了一些Java毕业设计的题目,可以参考一下&#xff0c;希望对大家有所帮助 文章目录 一、…

uniapp中解析markdown支持网页和小程序

对于markdown相信大家都不陌生&#xff0c;日常写文档或日常记录都用到的比较多&#xff0c;书写的是markdown的格式&#xff0c;实时预览的是转换后的html样式。本次实现的需求是在uniapp中转换markdown文本展示在不同的平台&#xff0c;主要平台是浏览器使用和微信小程序使用…

Instagram安全运营的10条策略

Instagram每月活跃用户15亿&#xff0c;是跨境外贸开发客户与广告引流的常用工具。本文总结10条Instagram运营基本策略与原则&#xff0c;帮助各位跨境人更好的了解平台规则&#xff0c;规避风险&#xff0c;提高投放效率&#xff01; 1、使用商业账号 企业在instagram 上进行…

北斗RTK高精度定位技术原理及优势

北斗RTK&#xff08;Real-Time Kinematic&#xff09;高精度定位技术是一种利用卫星导航系统进行实时定位的方法&#xff0c;它通过测量卫星信号的相位差来获得非常精确的位置信息。其原理和优势如下&#xff1a; 原理&#xff1a; 1. 载波相位差测量&#xff1a; RTK技术通过…

卷积过程详细讲解

1&#xff1a;单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。假设卷积核大小为3x3&#xff0c;padding0&#xff0c;stride1。 卷积过程如下&#xff1a; 相应的卷积核不断…

保姆级教程之VMD-SABO-KELM优化核极限学习机的西储大学轴承诊断

从数据处理&#xff0c;优化VMD特征提取&#xff0c;再到SABO&#xff08;减法平均优化器&#xff09;优化核极限学习机的故障诊断&#xff0c;实现故障诊断的全流程&#xff0c;其他类型的故障诊断均可参考此流程。 友情提示&#xff1a;对于刚接触故障诊断的新手来说&#xf…

安装Node(脚手架)

目录 一&#xff0c;安装node&#xff08;脚手架&#xff09;1.1&#xff0c; 配置vue.config.js1.2&#xff0c; vue-cli3x的目录介绍1.3&#xff0c; package.json 最后 一&#xff0c;安装node&#xff08;脚手架&#xff09; 从官网直接下载安装即可&#xff0c;自带npm包管…

spring依赖注入详解(下)

Autowired注解依赖注入过程 一、findAutowireCandidates()实现 找出BeanFactory中类型为type的所有的Bean的名字&#xff0c;注意是名字&#xff0c;而不是Bean对象&#xff0c;因为我们可以根据BeanDefinition就能判断和当前type是不是匹配&#xff0c;不用生成Bean对象把re…