【网格dp】力扣1594. 矩阵的最大非负积

给你一个大小为 m x n 的矩阵 grid 。最初,你位于左上角 (0, 0) ,每一步,你可以在矩阵中 向右 或 向下 移动。

在从左上角 (0, 0) 开始到右下角 (m - 1, n - 1) 结束的所有路径中,找出具有 最大非负积 的路径。路径的积是沿路径访问的单元格中所有整数的乘积。

返回 最大非负积 对 109 + 7 取余 的结果。如果最大积为 负数 ,则返回 -1 。

注意,取余是在得到最大积之后执行的。

示例 1:

输入:grid = \[-1,-2,-3,-2,-3,-3,-3,-3,-2]

输出:-1

解释:从 (0, 0) 到 (2, 2) 的路径中无法得到非负积,所以返回 -1 。
示例 2:

输入:grid = \[1,-2,1,1,-2,1,3,-4,1]

输出:8

解释:最大非负积对应的路径如图所示 (1 * 1 * -2 * -4 * 1 = 8)
示例 3:

输入:grid = \[1,3,0,-4]

输出:0

解释:最大非负积对应的路径如图所示 (1 * 0 * -4 = 0)

动态规划

cpp 复制代码
class Solution {
public:
    int maxProductPath(vector<vector<int>>& grid) {
        const int MOD = 1e9 + 7;
        int m = grid.size(), n = grid[0].size();
        vector<vector<long long>> maxgt(m, vector<long long>(n));
        vector<vector<long long>> mingt(m, vector<long long>(n));
        maxgt[0][0] = mingt[0][0] = grid[0][0];
        for(int i = 1; i < n; i++){
            maxgt[0][i] = mingt[0][i] = maxgt[0][i-1] * grid[0][i] ;
        }

        for(int i = 1; i < m;i++){
            maxgt[i][0] = mingt[i][0] = maxgt[i-1][0] * grid[i][0] ;
        }

        for(int i = 1;i < m; i++){
            for(int j = 1; j < n; j++){
                if(grid[i][j] >= 0){
                    maxgt[i][j] = max(maxgt[i-1][j],maxgt[i][j-1]) * grid[i][j];
                    mingt[i][j] = min(mingt[i-1][j],mingt[i][j-1]) * grid[i][j];
                }
                else{
                    maxgt[i][j] = min(mingt[i-1][j],mingt[i][j-1]) * grid[i][j];
                    mingt[i][j] = max(maxgt[i-1][j],maxgt[i][j-1]) * grid[i][j];
                }
            }
        }
        if(maxgt[m-1][n-1] < 0){
            return -1;
        }
        else{
            return maxgt[m-1][n-1] % MOD;
        }
    }
};

这道题要计算乘法的积,由于表格中可能出现负数,所以我们要维护两个数组,一个用来储存最小值,一个用来储存最大值。然后对grid进行遍历的同时记录这个网格的最小路径和最大路径,当grid为正数的时候,则与最大值相乘可以得到最大值,与最小值相乘得到最小值。当grid为负数的时候,则与最小值相乘得到最大值,与最大值相乘得到最小值。

最后一格如果最大值是负数,则返回-1,否则返回最大值。

相关推荐
Ivanqhz30 分钟前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
不会就选b1 小时前
算法日常・每日刷题--<动态规划>3
数据结构·算法
-dzk-2 小时前
【堆】LC 347.前 K 个高频元素
算法·堆
H.莓飛2 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia6262 小时前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
和裕3 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i3 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
淡海水3 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
无忧.芙桃4 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法
乐迪信息4 小时前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉