剑指offer47.礼物的最大价值

news2024/9/21 12:38:08

 这道题挺简单,学过动态规划就会。如果要走到grid[i][j],那你的上一步必须是grid[i-1][j]或者grid[i][j-1],具体是grid[i-1][j]还是grid[i][j-1],就看哪一步的价值最大,所以用一个与grid等大的dp数组来表示走到grid[i][j]的最大价值是dp[i][j]。最后返回dp数组的最后一个数就行。

首先初始话dp数组的第一行,第一行只能从左往右走,所以其实就是第一行累加到当前数就是dp[0][i]的值,接下来的数的动态转移方程是,如果dp[i-1]][j]>dp[i][j-1],dp[i][j]=dp[i-1][j]+grid[i][j],否则dp[i][j] = dp[i][j-1] + grid[i][j],当然这其中还要判断j-1是不是小于0,如果使得话说明这是一行第一个数他的左边没有数,只能从上面加。最后返回dp数组的最后一个数即可。以下是我的代码:

class Solution {
    public int maxValue(int[][] grid) {
      int row = grid.length;
      int clown = grid[0].length;
      int[][] dp = new int[row][clown];
      int sum =0;
      for(int i=0;i<clown;i++){
          sum+=grid[0][i];
          dp[0][i]=sum;
      }
      for(int i=1;i<row;i++){ 
          for(int j=0;j<clown;j++){
              if(j-1 >= 0){
                  if(dp[i-1][j] > dp[i][j-1]){
                      dp[i][j] = dp[i-1][j] + grid[i][j];
                  }else{
                      dp[i][j] = dp[i][j-1] + grid[i][j];
                  }
              }else{
                      dp[i][j] = dp[i-1][j] + grid[i][j];
              }
          }
      }
      return dp[row-1][clown-1];
    }
}

写完看了一下题解,题解稍微简洁一点,他的初始化是放在循环里一起完成,没有另外用一个循环。这是题解代码:

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[][] f = new int[m][n];
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i > 0) {
                    f[i][j] = Math.max(f[i][j], f[i - 1][j]);
                }
                if (j > 0) {
                    f[i][j] = Math.max(f[i][j], f[i][j - 1]);
                }
                f[i][j] += grid[i][j];
            }
        }
        return f[m - 1][n - 1];
    }
}

第0行和第0列都是通过累加的方法完成的,其他位置的他用了两次比较,第一次比dp[i][j]和dp[i-1][j],第二次比dp[i][j]和dp[i-1][j],取较大值,道理是一样的。

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

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

相关文章

阿里用户序列建模MIMN

Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction 摘要 对于序列建模&#xff0c;实践了机器学习算法与在线服务协同设计的CTR预测系统&#xff0c;理论上可以处理无限长的用户序列。 从服务系统的角度来看&#xff0c;通过设计一个单…

MIT 6.830数据库系统 -- lab five

MIT 6.830数据库系统 -- lab five 项目拉取引言搜索练习1 BTreeFile.findLeafPage() 插入练习2 Spliting Page 删除练习3 页再分配练习4 合并页 事务 项目拉取 原项目使用ant进行项目构建&#xff0c;我已经更改为Maven构建&#xff0c;大家直接拉取我改好后的项目即可: http…

选择器jQuery

诚信是你价格不菲的鞋子&#xff0c;踏遍千山万水&#xff0c;质量也应永恒不变。 jQuery选择器大全总结&#xff1a; jQuery选择器是一种用于在HTML文档中选择元素的强大工具。下面是一些常用的jQuery选择器的总结&#xff1a; 基本选择器&#xff1a; 元素选择器&#xff1a…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作&#xff0c;今天宏哥就用具体例子&#xff0c;将上一篇中的理论知识实践一下。而且在实际测试过程中&#xff0c;有时候需要修改请求或响应数据&#xff0c;或者直接模拟服务器响应&#xff0c;此时可以使用fiddler进行…

测试|测试用例设计常见面试题

测试|测试用例设计常见面试题 文章目录 测试|测试用例设计常见面试题1.怎么模拟弱网&#xff08;测试技巧&#xff09;2.怎么测试接口&#xff08;测试技巧&#xff09;3.怎么对冒泡排序测试&#xff08;代码类&#xff09;4.怎么对linux的zip命令进行测试&#xff08;软件类&a…

Linux: 设置qmake的Qt版本

Qt开发&#xff0c;qmake会对应一个Qt版本&#xff0c;有时候需要切换这个版本&#xff0c;例如把qmake从Qt5.12切换到Qt5.9, 怎么操作呢&#xff1f; 案例如下&#xff1a; 银河麒麟V10系统&#xff0c;下载安装了Qt5.9.8&#xff0c;但是检查qmake发现它使用的是5.12.8&…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive)

JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive) 一、keep-alive介绍 keep-alive是vue的一个内置实例&#xff0c;通过这个属性可以缓存组件的v-node&#xff0c;可以实现页面缓存的功能。 keep-alive有三个属性&#xff1a; 1.include&#xff1a;记录了哪些组件可…

【Spring】聊聊Spring如何解决的循环依赖以及三级缓存

循环依赖是什么 在平时的面试中&#xff0c;只要问到Spring&#xff0c;那么大概率肯定会问什么是循环依赖&#xff0c;Sping是如何解决循环依赖的。以及三级缓存机制是什么。所以为了从根本上解决这个问题&#xff0c;本篇主要详细介绍一下循环依赖的问题。 Spring Bean初始…

IDEA格式化代码快捷键Ctrl+Alt+L失效解决

常见问题是网易云全局快捷键冲突 解决方法&#xff1a;取消下面的全局快捷键勾选

查看进程方式

目录 ps top uptime pstree ps 查看静态的进程统计信息 top 实时显示系统中各个进程的资源占用情况 第一行 top - 17:00:23 up 15 min, 1 user, load average: 1.05, 1.22, 0.98 17:00:23————当前时间 up 15 min————系统运行时间 1 user————当前登录用户数…

客户端实现阿里云OSS文件上传(分片上传,断点续传)

前言 阿里云OSS&#xff08;Object Storage Service&#xff09;是一种稳定、安全、高扩展性的云存储服务&#xff0c;它允许您以低成本、高可靠、高可用的方式存储和访问任意类型的数据。在实际应用中&#xff0c;文件上传是一个常见的功能需求。为了提高上传效率和文件完整性…

Leetcode-每日一题【剑指 Offer 56 - I. 数组中数字出现的次数】

题目 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 示例 1&#xff1a; 输入&#xff1a;nums [4,1,4,6]输出&#xff1a;[1,6] 或 [6,1] 示例 2&#x…

IOS开发:去除TabView的底部留白

我最近在做IOS开发的时候&#xff0c;使用SwiftUI中的TabView做左右滚动的页面切换&#xff0c;遇到了页面底部有大量留白无法去除的问题&#xff1a; 我查了很多资料都没有看到网上有人记录这个问题的解决方案&#xff0c;后来查阅apple developer的文档&#xff0c;我发现.ed…

模电基础知识学习笔记

文章目录&#xff1a; 一&#xff1a;基本元器件介绍 1.二极管 1.1 普通二极管特性测试 1.2 稳压二极管测试 1.3 整流二极管 1.4 开关二极管 2.电容 3.三极管(电流控制) 3.1 介绍 3.2 类型&#xff08;PNP、NPN&#xff09; 3.3 三种工作状态:放大状态、截止状态…

RBAC权限详解

1.传统的权限设计 首先&#xff0c;我们先了解下什么是传统的权限设计 从上面的图中&#xff0c;我们发现&#xff0c;传统的权限设计是对每个人进行单独的权限设置&#xff0c;但这种方式已经不适合目前企业的高效管控权限的发展需求&#xff0c;因为每个人都要单独去设置权限…

大盗阿福(记忆化搜索板子)

提供核心代码&#xff1a;&#xff08;经典的记忆化搜索套路&#xff09; int dfs(int pos){if(f[pos]!-1) return f[pos];//记忆化if(pos>n) return 0;//边界&#xff0c;越界int sum0;//模板int f10,f20;f1dfs(pos1);f2dfs(pos2)w[pos];summax(f1,f2);//模板f[pos]sum;//模…

表达式树

请设计一个算法&#xff0c;将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。 例如&#xff0c;当下列两棵表达式树作为算法的输入时&#xff1a; 输出的等价中缀表达式分别为 (ab)*(c*(-d)) 和 (a*b)(-(c-d))。 注意&#xff1a; 树…

ChatGPT炒股:自动批量提取股票公告中的表格并合并数据

在很多个股票公告中&#xff0c;都有同样格式的“日常性关联交易”的表格&#xff0c;如何合并到一张Excel表格中呢&#xff1f; 首先&#xff0c;在ChatGPT中输入提示词&#xff1a; 写一段Python代码&#xff1a; F盘文件夹“新三板 2023年日常性关联交易20230704”中很多…

零代码编程:PDF文件名和Excel数据进行比对找不同

F盘“北交所招股说明书”文件夹下有150个文件&#xff1b; F盘”北证A股20230703.xlsx”表格中证券名称有200多个&#xff1b; 现在想找出文件夹下的哪些证券名称不在表格里面。 在ChatGPT中输入提示词&#xff1a; 写一段Python程序&#xff1a; F盘“北交所招股说明书”文…

qt源码--事件系统之QAbstractEventDispatcher

1、QAbstractEventDispatcher内容较少&#xff0c;其主要是定义了一些注册接口&#xff0c;如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下&#xff1a; 其主要定义了大量的纯虚函数&#xff0c;具体的实现会根据不同的系统平台&#xff0c;实现对应的方…