leetcode 1594. 矩阵的最大非负积

news/2025/2/21 1:08:01/

题目如下
在这里插入图片描述

数据范围
在这里插入图片描述
示例
在这里插入图片描述

本题难就难在矩阵存在负数,我们可以先思考如果矩阵每个数都大于等于0那么很简单我们只需要维护左边和上面的最大值即可。那么如果遇到负数显然要得到最大值就要和左边和右边的最小值相乘。所以这里我们维护两个二维数组用于存从(0,0)开始到(i,j)的最大值和最小值。

通过代码

class Solution {
public:int maxProductPath(vector<vector<int>>& grid) {int n = grid.size();int m = grid[0].size();int mod = 1e9 + 7;vector<vector<long long>> dp1(n, vector<long long>(m));vector<vector<long long>> dp2(n, vector<long long>(m));dp1[0][0] = dp2[0][0] = grid[0][0];for (int i = 1; i < n; i++) {dp1[i][0] = dp2[i][0] = grid[i][0] * dp1[i - 1][0];}for (int i = 1; i < m; i++) {dp1[0][i] = dp2[0][i] = grid[0][i] * dp1[0][i - 1];}for (int i = 1; i < n; i++) {for (int j = 1; j < m; j++) {if (grid[i][j] >= 0) {dp1[i][j] = max(dp1[i - 1][j], dp1[i][j - 1]) * grid[i][j];dp2[i][j] = min(dp2[i - 1][j], dp2[i][j - 1]) * grid[i][j];} else {dp1[i][j] = min(dp2[i - 1][j], dp2[i][j - 1]) * grid[i][j];dp2[i][j] = max(dp1[i - 1][j], dp1[i][j - 1]) * grid[i][j];}}}if (dp1[n - 1][m - 1] < 0)return -1;return dp1[n - 1][m - 1] % mod;}
};

在这里插入图片描述

利用滚动数组思想优化后的代码

class Solution {
public:int maxProductPath(vector<vector<int>>& grid) {int n = grid.size();int m = grid[0].size();int mod = 1e9 + 7;vector<long long> dp1(m);vector<long long> dp2(m);long long t1, t2;dp1[0] = dp2[0] = grid[0][0];for (int i = 1; i < m; i++) {dp1[i] = dp2[i] = grid[0][i] * dp1[i - 1];}for (int i = 1; i < n; i++) {dp1[0] = dp2[0] = dp1[0] * grid[i][0];for (int j = 1; j < m; j++) {if (grid[i][j] >= 0) {dp1[j] = max(dp1[j - 1], dp1[j]) * grid[i][j];dp2[j] = min(dp2[j - 1], dp2[j]) * grid[i][j];} else {t1 = max(dp1[j - 1], dp1[j]);t2 = min(dp2[j - 1], dp2[j]);dp1[j] = t2 * grid[i][j];dp2[j] = t1 * grid[i][j];}}}if (dp1[m - 1] < 0)return -1;return dp1[m - 1] % mod;}
};

在这里插入图片描述


http://www.ppmy.cn/news/1573324.html

相关文章

linux 安装启动zookeeper全过程及遇到的坑

1、下载安装zookeeper 参考文章&#xff1a;https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法&#xff1a;参考&#xf…

python学opencv|读取图像(七十四)人脸识别:EigenFaces算法

【1】引言 前序学习进程中&#xff0c;做的是检测&#xff0c;只是能检测出来由人脸、猫脸和行人&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;七十一&#xff09;使用cv2.CascadeClassifier()函数detectMultiScale()函数实现图像中的人脸检测…

BERT 大模型

BERT 大模型 EmbeddingTransformer预微调模块预训练任务 BERT 特点 : 优点 : 在语言理解相关任务中表现很好缺点 : 更适合 NLU 任务&#xff0c;不适合 NLG 任务 BERT 架构&#xff1a;双向编码模型 : Embedding 模块Transformer 模块预微调模块 Embedding Embedding 组成 …

Ubuntu部署deepseek(离线版)

由于实验室的服务器无法连外网,只能离线手动安装了!!! 离线下载ollama-linux-amd64.tgz 网址:https://ollama.com/download/ollama-linux-amd64.tgz 第一步:解压安装包 切换到目标文件夹 cd /home/zhangh/Ollama 解压安装包 tar -xzf ollama-linux-amd64.tgz -C /usr/…

Linux-IO编程

Linux操作组成 一、文件 在 Linux 中&#xff0c;有一句经典的话叫做&#xff1a;一切皆文件。这句话是站在内核的角度说的&#xff0c;因为 在内核中所有的设备 (除了网络接口) 都一律使用 Linux 独有的虚拟文件系统 (VFS) 来管 理。这样做的最终目的&#xff0c;是将各种不…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能体系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 库占据着重要的地位。作为一个与动态数据交换&#xff08;DDE&#xff09;紧密相关的库文件&#xff0c;它为 LabVIEW 用户提供了与其他…

摄像头畸变矫正

简单介绍 所谓畸变其实就是由摄像头引起的图片失真, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释直线被拍成了曲线, 这让我想起来了一个表情包. 去畸变的办法 首先我们需要一个标准棋盘(印有特定的标定图案), 如图: 把它摊平放在桌子上, 然后用…

MySQL 中各种日志简介

MySQL 日志 慢查询日志(Slow query log) 慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的SQL语句组成&#xff0c;并且检 查的⾏数⼤于系统变量 min_examined_row_limit 指定值。被记录的慢查询需要进⾏优化&#xff0c; 可以使⽤mysqldumpslow客⼾端程序对慢…