当前位置: 首页 > article >正文

力扣1594. 矩阵的最大非负积

力扣1594. 矩阵的最大非负积

题目

在这里插入图片描述

题目解析及思路

题目要求返回从左上到右下的最大非负积,本题和简单图dp的区别就是出现了负数

grid[i][j] >= 0则和简单图dp一致,dp[i][j] = max(dp[i-1][j],dp[i][j-1]) * grid[i][j]

grid[i][j] < 0则分两种情况,由于不知道该留大的还是小的,于是开两个dp数组把大小两个都存下来

mn[i][j] = max(mx[i-1][j],mx[i][j-1]) * grid[i][j];

mx[i][j] = min(mn[i-1][j],mn[i][j-1]) * grid[i][j];

代码

class Solution {
public:
    int maxProductPath(vector<vector<int>>& grid) {
        int mod = 1e9 + 7;
        int n = grid.size();
        int m = grid[0].size();
        vector<vector<long long>> mx(n,vector<long long>(m));
        vector<vector<long long>> mn(n,vector<long long>(m));
        //初始化起点
        mx[0][0] = mn[0][0] = grid[0][0];
        //第一行第一列只从一个方向更新,预处理一下
        for(int i=1;i<n;i++){
            mx[i][0] = mn[i][0] = mx[i-1][0] * grid[i][0];
        }
        for(int i=1;i<m;i++){
            mx[0][i] = mn[0][i] = mx[0][i-1] * grid[0][i];
        }
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                if(grid[i][j] >= 0){
                    //正数就正常更新
                    mx[i][j] = max(mx[i-1][j],mx[i][j-1]) * grid[i][j];
                    mn[i][j] = min(mn[i-1][j],mn[i][j-1]) * grid[i][j];
                }
                else{
                    //负数就用max求较小值
                    mn[i][j] = max(mx[i-1][j],mx[i][j-1]) * grid[i][j];
                    mx[i][j] = min(mn[i-1][j],mn[i][j-1]) * grid[i][j];
                }
            }
        }
        return mx[n-1][m-1] >= 0 ? mx[n-1][m-1] % mod : -1;
    }
};

http://www.kler.cn/a/571699.html

相关文章:

  • 爬蟲動態IP代理與數據採集穩定性
  • 【文生图】Win10环境借助基于ComfyUI的图狗2.3.1抢先体验阿里万相wan2.1
  • 【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)
  • OpenHarmony文件管理子系统
  • XMOS推出“免开发固件方案”将数字接口音频应用的开发门槛大幅降低
  • angular实现nodejs增删改查
  • 前端2025
  • 开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维
  • Spring Boot Gradle 项目中使用 @Slf4j 注解
  • 基于微信小程序的竞赛报名系统设计与实现
  • 能做期权交易的标的物有哪些?
  • IO进程线程2
  • vscode设置不自动打开项目【超详细图解】
  • 深度学习R8周:RNN实现阿尔兹海默症(pytorch)
  • C++学习(七)(标准库+STL(iotstream公司,日期/时间,器皿,算法,迭代器,多线程))
  • 深入理解网络通信中的关键概念:HTTP、TCP与Socket的关系及TCP的可靠性保障
  • Google C++ 开源风格指南
  • 用AI学安卓游戏开发1——控制小球上下左右移动2
  • JavaEE基础之-sessioncookie
  • centos和ubunt下安装redis