在矩阵回溯中进行累加和比较的注意点

1 总结

在回溯时,如果递归函数采用void返回,在入口处使用了sum变量,那么一般在初次调用dfs的地方,这个sum的初始值可能不是0,而是数组的对应指针的值,在比较操作的时候,需要在for循环开始之前进行,这样确保不遗漏corner case

2 题目

2.1 LC1219. 黄金矿工

2.1.1 答案:下面是我的答案,不能通过所有case

比如无法通过case, 正确答案是9,但是执行后的答案是7, [[0,6,1],[0,0,0],[0,9,0]]

从代码中我们可以看到比较值更新msum(msum=Math.max(msum,sum+grid[nx][ny]);)的时机不对,如果有一个非0值的周围都是0值,那么这个值本身没有参与比较,即潜在的最大值可能被忽略

class Solution {int msum=0;public int getMaximumGold(int[][] grid) {int m=grid.length;int n=grid[0].length;int ans=0;boolean vis[][]=new boolean[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]!=0){msum=0;vis[i][j]=true;dfs2(grid,i,j,vis,grid[i][j]);vis[i][j]=false;ans=Math.max(ans,msum);}}}return ans;}int[]dirs=new int[]{-1,0,1,0,-1};void dfs2(int[][] grid, int x, int y,boolean vis[][],int sum){for(int i=0;i<4;i++){int nx=x+dirs[i];int ny=y+dirs[i+1];if(nx>=0&&nx<grid.length&&ny>=0&&ny<grid[0].length){if(grid[nx][ny]==0)continue;if(vis[nx][ny])continue;vis[nx][ny]=true;msum=Math.max(msum,sum+grid[nx][ny]);dfs2(grid,nx,ny,vis,sum+grid[nx][ny]);vis[nx][ny]=false;}}}
}

2.1.2 标准答案:(相比于2.1.1答案,仅仅是移动了一行代码就通过了所有case)

class Solution {int msum=0;public int getMaximumGold(int[][] grid) {int m=grid.length;int n=grid[0].length;int ans=0;boolean vis[][]=new boolean[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]!=0){msum=0;vis[i][j]=true;dfs2(grid,i,j,vis,grid[i][j]);vis[i][j]=false;ans=Math.max(ans,msum);}}}return ans;}int[]dirs=new int[]{-1,0,1,0,-1};void dfs2(int[][] grid, int x, int y,boolean vis[][],int sum){msum=Math.max(msum,sum);// 移动的那行代码for(int i=0;i<4;i++){int nx=x+dirs[i];int ny=y+dirs[i+1];if(nx>=0&&nx<grid.length&&ny>=0&&ny<grid[0].length){if(grid[nx][ny]==0)continue;if(vis[nx][ny])continue;vis[nx][ny]=true;dfs2(grid,nx,ny,vis,sum+grid[nx][ny]);vis[nx][ny]=false;}}}
}

2.1.3 官方标准答案:下面是标准答案,通过所有case

class Solution {int[][] g;boolean[][] vis;int m, n;int[][] dirs = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};public int getMaximumGold(int[][] grid) {g = grid;m = g.length; n = g[0].length;vis = new boolean[m][n];int ans = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (g[i][j] != 0) {vis[i][j] = true;ans = Math.max(ans, dfs(i, j));vis[i][j] = false;}}}return ans;}int dfs(int x, int y) {int ans = g[x][y];for (int[] d : dirs) {int nx = x + d[0], ny = y + d[1];if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;if (g[nx][ny] == 0) continue;if (vis[nx][ny]) continue;vis[nx][ny] = true;ans = Math.max(ans, g[x][y] + dfs(nx, ny));vis[nx][ny] = false;}return ans;}
}作者:宫水三叶
链接:https://leetcode.cn/problems/path-with-maximum-gold/solutions/1245984/gong-shui-san-xie-hui-su-suan-fa-yun-yon-scxo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.1.4 总结:

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

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

相关文章

高工微报告|智驾前视一体机趋势

传统智驾前视一体机赛道上&#xff0c;1V3R、1V5R产品如何升级备受关注。 根据日前调研获取的信息&#xff0c;1V3R、1V5R向轻量级行泊一体&#xff08;典型为5V5R12U方案&#xff0c;算力平台5-20TOPS&#xff09;迈进的具体市场空间&#xff0c;仍在验证阶段。 其中&#x…

c#图片作为鼠标光标

图片转换为鼠标光标代码如下&#xff1a; private void Form1_Load(object sender, EventArgs e) {//button1.Cursor System.Windows.Forms.Cursors.Hand;Bitmap bmp new Bitmap("780.jpg");Cursor cursor new Cursor(bmp.GetHicon());button1.Cursor cursor;} …

设计模式基础概念:探索设计模式的魅力

设计模式是软件开发中的一种指导性概念&#xff0c;它提供了一套被广泛接受的解决方案&#xff0c;用于常见的设计问题。设计模式有助于提高软件的可重用性、可扩展性和可维护性&#xff0c;并促进团队之间的沟通。 以下是一些常见的设计模式&#xff1a; 创建型模式&#xff1…

CSS进阶方法——复合选择器、元素显示、背景设置

1、复合选择器 复合选择器是建立在基础选择器之上&#xff0c;对基础选择器进行组合形成的。 复合选择器可以更准确、更高效的选择目标元素&#xff08;标签&#xff09;复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的常用的复合选择器包括&#xf…

Js使用ffmpeg在视频中合成音频背景音乐

Js使用ffmpeg在视频中合成音频背景音乐 ffmpeg 使用场景是需要在web端对视频的背景音乐进行混音合成。 注意: 以下所有的使用案例均基于vue3 setup。 同时由于ffmpeg版本不同会导致使用的api不同&#xff0c;使用案例前需要注意ffmpeg版本问题。 如果使用的是0.12需要使用…

CMake入门教程【实战篇】使用开源库cmake-modules简化项目开发与维护

文章目录 简介项目地址项目特点使用方式模块使用模块说明示例结论简介 本教程介绍了rpavlik/cmake-modules,一个CMake模块集合,旨在简化和优化CMakeLists.txt文件的编写和维护工作。该集合尤其对虚拟现实和物理模拟包的开发者有用,同时也包含通用实用模块和针对旧版CMake的…

20240112-【UNITY 学习】实现第一人称移动教程

1、创建一个空物体&#xff0c;挂载Rigidbody组件&#xff0c;并设置相应参数 2、在上述空物体下创建一个胶囊体&#xff0c;两个空物体&#xff0c;一个用来控制朝向&#xff0c;另一个用来控制摄像机 3、给摄像机创建一个父物体&#xff0c;并挂载脚本MoveCamera_01.cs using…

“数据要素×”行动计划发布,粮食安全监管如何应变?

近日&#xff0c;国家数据局发布“数据要素”三年行动计划&#xff08;2024-2026年&#xff09;&#xff0c;在“数据要素现代农业“部分提到&#xff1a;提升农业综合生产能力&#xff0c;支持农业生产经营主体和相关服务企业融合利用气象、土壤、农事作业、病虫害、市场等数据…

pyQt第一个程序

from PyQt6.QtWidgets import QApplication, QWidget, QLabel import sys from uitest import testuiapp QApplication(sys.argv) window QWidget() window.setWindowTitle("程序") window.resize(1000, 800) lb QLabel() lb.setParent(window) lb.setText("…

wav2lip中文语音驱动人脸训练

1 Wav2Lip介绍 1.1 Wav2Lip概述 2020年&#xff0c;来自印度海德拉巴大学和英国巴斯大学的团队&#xff0c;在ACM MM2020发表了的一篇论文《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild 》&#xff0c;在文章中&#xff0c;他们提出一个叫做…

Jenkins基础篇--添加节点

节点介绍 Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点)&#xff0c;分布式构建能够让同一套代码在不同的环境(如&#xff1a;Windows 和 Linux 系统)中编译、测试等。 Jenkins 运行的主机在逻辑上是 master 节点&#xff0c;下图是主节点和从节点的关系。 添加节点 …

2024年五款值得买的云服务器推荐,便宜又好用

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

Bluefin借助Sui性能,交出亮眼的DeFi成绩

Bluefin的创始人希望在去中心化平台上提供先进、资本效率高的衍生品交易。要与传统金融领域的竞争对手一较高下&#xff0c;该平台需要在性能、成本效益和可访问性方面表现出色&#xff0c;以服务机构和个人用户。 2023年&#xff0c;Bluefin团队在Arbitrum上进行的beta发布帮…

Android studio第一次构建项目Gradle失败的解决方法

每次在AS上新创建一个项目&#xff0c;gradle要下载半天或者是直接下载半天后以失败告终&#xff0c;抓狂并崩溃。 原因&#xff1a; 这是因为AS默认去下载gradle的网站是在国外的&#xff0c;而且国内的网络经常是访问不到那个网站的&#xff0c;能访问到有时候就跟中大奖一…

GPT function calling v2

原文&#xff1a;GPT function calling v2 - 知乎 OpenAI在2023年11月10号举行了第一次开发者大会&#xff08;OpenAI DevDays&#xff09;&#xff0c;其中介绍了很多新奇有趣的新功能和新应用&#xff0c;而且更新了一波GPT的API&#xff0c;在1.0版本后的API调用与之前的0.…

springboot057洗衣店订单管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 研究背景 如…

《NLP入门到精通》栏目导读

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》&#xff0c;因此&#xff0c;读者需要一定得深度学习基础&#xff0c;才能过度到此栏目内容。 二、博客建设理念 本博客基地&am…

C++系列-第1章顺序结构-6-加法、减法和乘法

在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客&#xff0c;主要讲述加法减法乘法的用法 加法 减法 乘法 当然可以。下面我将分别为初一的同学提供C中加法、减法、乘法的简单教程和案例&#xff0c;最后再提供一个综合性的…

GIT 分支管理办法(二)

GIT 分支管理办法&#xff08;二&#xff09; 一. 大型项目分支管理中存在的痛点 大型项目中需求的上线存在很大的不确定性&#xff0c;而且往往存在多版本、多团队、多开发并行的情况。尤其是大型企业对上线分支中编号的管理十分严苛&#xff0c;严禁夹带上线。这时对于开发…