博客
关于我
1594 矩阵的最大非负积(动态规划)
阅读量:365 次
发布时间:2019-03-04

本文共 2365 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要找到从矩阵左上角到右下角的所有路径中,具有最大非负积的路径。由于路径只能向右或向下移动,这是一个典型的动态规划问题。

方法思路

  • 问题分析:路径只能向右或向下移动,因此我们可以使用动态规划来记录每个点的最大和最小乘积。最大乘积可能由当前点的正数与之前的最大乘积相乘得到,而最小乘积可能由当前点的负数与之前的最小乘积相乘得到。这样可以确保我们在后续步骤中考虑所有可能的正乘积情况。

  • 状态定义:使用两个二维数组max_dpmin_dp,分别记录到达每个点时的最大和最小乘积。

  • 初始化:起点(0,0)的值直接赋值给max_dpmin_dp

  • 填充边缘:处理第一行和第一列的值,因为它们只能从左边或上边移动过来。

  • 动态规划转移:对于每个点,计算其max_dpmin_dp值,考虑从左边和上边移动过来的可能性,并结合当前点的值进行计算。

  • 结果判断:到达终点后,检查最大乘积是否为非负数,并返回结果。

  • 解决代码

    from typing import ListMOD = 10**9 + 7class Solution:    def maxProductPath(self, grid: List[List[int]]) -> int:        rows = len(grid)        if rows == 0:            return -1        cols = len(grid[0])        if cols == 0:            return -1                # 初始化max_dp和min_dp矩阵        max_dp = [[0] * cols for _ in range(rows)]        min_dp = [[0] * cols for _ in range(rows)]                # 起点        max_dp[0][0] = min_dp[0][0] = grid[0][0]                # 填充第一行        for j in range(1, cols):            max_dp[0][j] = max_dp[0][j-1] * grid[0][j]            min_dp[0][j] = min_dp[0][j-1] * grid[0][j]                # 填充第一列        for i in range(1, rows):            max_dp[i][0] = max_dp[i-1][0] * grid[i][0]            min_dp[i][0] = min_dp[i-1][0] * grid[i][0]                # 填充剩余部分        for i in range(1, rows):            for j in range(1, cols):                # 计算当前位置可能的max和min                candidates_max = [                    max_dp[i-1][j] * grid[i][j],                    max_dp[i][j-1] * grid[i][j],                    min_dp[i-1][j] * grid[i][j],                    min_dp[i][j-1] * grid[i][j]                ]                current_max = max(candidates_max)                candidates_min = [                    max_dp[i-1][j] * grid[i][j],                    max_dp[i][j-1] * grid[i][j],                    min_dp[i-1][j] * grid[i][j],                    min_dp[i][j-1] * grid[i][j]                ]                current_min = min(candidates_min)                                max_dp[i][j] = current_max                min_dp[i][j] = current_min                # 检查终点是否非负        final_max = max_dp[rows-1][cols-1]        if final_max >= 0:            return final_max % MOD        else:            return -1

    代码解释

  • 初始化:创建max_dpmin_dp矩阵,起点初始化为grid[0][0]

  • 填充边缘:处理第一行和第一列的值,使用当前点的值与前一个点的值相乘。

  • 动态规划转移:对于每个点,计算其max_dpmin_dp值,考虑从左边和上边移动过来的可能性,并结合当前点的值进行计算。

  • 结果判断:到达终点后,检查最大乘积是否为非负数,并返回结果。结果需要对10^9 + 7取模,若最大乘积为负数则返回-1。

  • 转载地址:http://nmgr.baihongyu.com/

    你可能感兴趣的文章
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
    查看>>
    nodejs libararies
    查看>>
    nodejs-mime类型
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm和yarn的使用对比
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    NR,NF,FNR
    查看>>
    nrf开发笔记一开发软件
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSOperation基本操作
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>