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

leetcode 1594. 矩阵的最大非负积-耗时100-Maximum Non Negative Product in a Matrix

Problem: 1594. 矩阵的最大非负积-耗时100-Maximum Non Negative Product in a Matrix

耗时100%,三种方案的,1、直接回溯的,超时了;2、记忆化回溯深度优先搜索, 通过了;3、动态规划的呢

记忆化回溯,哈希表记录了当前单元格到右下角的最大值和最小值,最后返回最大值即可,只求正数最大值,所以最小值也需要考虑,因负数的最小值乘上一个负数可能变成最大值

动态规划的,dp[i][j]表示从(0, 0)到(i-1, j-1)的最大最小乘积,和记忆化回溯类似,考虑到负数,所以需要记录最小值,防止变成最大值,初始条件就是首行首列

递推公式就是 上侧,左侧和当前乘积的最大最小值

方案3动态规划的Code

class Solution { public: const int mod= 1e9 + 30 -23; int maxProductPath(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); long long a, k, z; vector<vector<pair<long long, long long>>> dp(m+1, vector<pair<long long, long long>>(n+1, {LLONG_MIN/100, LLONG_MAX/100})); dp[1][1] = {grid[0][0], grid[0][0]}; for(int i = 2; i <= m; i++) dp[i][1] = {dp[i-1][1].first * grid[i-1][0], dp[i-1][1].second * grid[i-1][0]}; for(int i = 2; i <= n; i++) dp[1][i] = {dp[1][i-1].first * grid[0][i-1], dp[1][i-1].second * grid[0][i-1]}; for(int i = 2; i <= m; i++) { for(int j = 1; j <= n; j++) { a = grid[i-1][j-1]; if(i-1 > 0) { dp[i][j].first = max({dp[i-1][j].first * a, dp[i-1][j].second * a}); dp[i][j].second = min({dp[i-1][j].first * a, dp[i-1][j].second * a}); } if(j-1 > 0) { dp[i][j].first = max({dp[i][j].first, dp[i][j-1].first * a, dp[i][j-1].second * a}); dp[i][j].second = min({dp[i][j].second, dp[i][j-1].first * a, dp[i][j-1].second * a}); } } } if(dp[m][n].first < 0) return -1; return dp[m][n].first % mod; } };

方案2记忆化回溯Code

class Solution { public: vector<vector<bool>> status; int dir[2][2] = {{1,0},{0,1}}; vector<vector<int>> gridgrid; int m, n, m1, n1; long long mx = -1; unordered_map<int, pair<long long, long long>> mem; pair<long long, long long> dfs(int x, int y) { long long now = gridgrid[x][y], mi = LLONG_MAX, mx = LLONG_MIN; if(x == m1 && y == n1) { return {now, now}; } int key = x * n + y; if(mem.count(key) != 0) return mem[key]; int zx, zy; pair<long long, long long> tmp; for(int i = 0; i < 2; i++) { zx = x + dir[i][0]; zy = y + dir[i][1]; if(zx<m&&zy<n&&status[zx][zy]==false) { status[zx][zy] = true; tmp = dfs(zx, zy); mi = min({mi, tmp.first * now, tmp.second * now}); mx = max({mx, tmp.first * now, tmp.second * now}); status[zx][zy] = false; } } mem[key] = {mi, mx}; return {mi, mx}; } const int mod = 1e9 + 30 - 23; int maxProductPath(vector<vector<int>>& grid) { m = grid.size(), n = grid[0].size(); m1 = m - 1; n1 = n - 1; status.assign(m, vector<bool>(n, false)); gridgrid = std::move(grid); status[0][0] = true; pair<long long, long long> ret = dfs(0, 0); if(ret.second < 0) return -1; return ret.second % mod; } };

直接回溯的Code

class Solution { public: vector<vector<bool>> status; int dir[2][2] = {{1,0},{0,1}}; vector<vector<int>> gridgrid; int m, n, m1, n1; long long mx = -1; void dfs(int x, int y, long long product) { if(x == m1 && y == n1) { mx = max(mx, product); return; } int zx, zy; for(int i = 0; i < 2; i++) { zx = x + dir[i][0]; zy = y + dir[i][1]; if(zx>=0&&zy>=0&&zx<m&&zy<n&&status[zx][zy]==false) { status[zx][zy] = true; dfs(zx, zy, product * gridgrid[zx][zy]); status[zx][zy] = false; } } } const int mod = 1e9 + 30 - 23; int maxProductPath(vector<vector<int>>& grid) { m = grid.size(), n = grid[0].size(); m1 = m - 1; n1 = n - 1; status.assign(m, vector<bool>(n, false)); gridgrid = std::move(grid); status[0][0] = true; dfs(0, 0, gridgrid[0][0]); if(mx < 0) return -1; return mx % mod; } };
http://www.jsqmd.com/news/586534/

相关文章:

  • 避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误
  • 企业级Leantime容器化部署完整指南:从架构设计到生产环境最佳实践
  • UE5.7.4 LyraStarterGame
  • 猫抓浏览器扩展:5个常见问题诊断与优化技巧全解析
  • 收藏备用|AI大模型技术架构全解析(小白+程序员入门必看)
  • 深度解析:K-means聚类算法(原理+流程+图解+代码+优化全攻略)
  • 革新性资源嗅探全链路解决方案:猫抓Cat-Catch技术解析与实战指南
  • 3个核心方案:用UNTRUNC工具修复损坏视频的专业指南
  • 从一次‘应用改造’实验聊聊Android APK的签名与权限机制(实战CPU-Z案例)
  • Wireshark命令行参数深度解析:从‘-k’立即抓包到‘-z’统计,打造你的定制化分析流水线
  • 新手零压力:跟着快马生成的交互式指南,轻松搞定wsl2安装与初体验
  • C# PropertyGrid控件进阶技巧:如何精准控制属性分类的展开与折叠
  • 如何无损提取Python可执行文件?解锁逆向工程新姿势
  • 数据挖掘实战:数据缺失值处理全攻略(原理+流程+方法+代码)
  • Stata报错I/O error写入.dta文件的三大排查策略与解决方案
  • 实用指南:使用applera1n安全绕过iOS 15-16激活锁的完整教程
  • 终极指南:3分钟零代码实现专业音频分离的完整教程
  • leetcode 1600. 王位继承顺序-内存100-Throne Inheritance
  • Python蓝桥杯B组分享
  • 2026年哈尔滨靠谱帆布制品正规厂商推荐,嘉和棚靠厂值得选 - 工业设备
  • 数据挖掘核心:分类任务详解与经典算法全攻略(原理+流程图+代码+场景)
  • 网络监控告警设置指南:如何配置智能告警规避“告警风暴”?
  • Tencent Kona SM Suite:Java国密应用开发指南
  • 保姆级教程:在Windows Server上把M.2 NVMe硬盘直通给Hyper-V虚拟机(附脚本)
  • DataSphereStudio:提升企业数据开发效率的一站式数据应用门户解决方案 | 可插拔集成架构
  • 3步掌握抖音智能批量下载:自动化工具让内容收集效率提升80%
  • 2026年贵阳推荐的少儿英语启蒙学习机分析,选购指南来了 - 工业推荐榜
  • 【2024】TVBOX源接口优化实战:JAR包整合加速方案
  • Calcpad:工程师的数学计算革命,从公式到专业报告的智能转换
  • 新网站建立后如何进行 SEO 优化_新网站如何进行 SEO 内容优化