5521 矩陣的最大非負積 dp

2022-05-25 05:33:10 字數 1438 閱讀 7412

給你乙個大小為 rows x cols 的矩陣 grid 。最初,你位於左上角 (0, 0) ,每一步,你可以在矩陣中 向右 或 向下 移動。

在從左上角 (0, 0) 開始到右下角 (rows - 1, cols - 1) 結束的所有路徑中,找出具有 最大非負積 的路徑。路徑的積是沿路徑訪問的單元格中所有整數的乘積。

返回 最大非負積 對 109 + 7 取餘 的結果。如果最大積為負數,則返回 -1 。

注意,取餘是在得到最大積之後執行的。

示例 1:

輸入:grid = [[-1,-2,-3],

[-2,-3,-3],

[-3,-3,-2]]

輸出:-1

解釋:從 (0, 0) 到 (2, 2) 的路徑中無法得到非負積,所以返回 -1

因為是求非負的最大積,所以既要計算最大值也要計算最小值,當然最後返回的是最大值

class solution:

def maxproductpath(self, g: list[list[int]]) -> int:

if not g:

return 0

mod = 10 ** 9 + 7

n, m = len(g), len(g[0])

# 初始化

ans = [

[[0, 0] for _ in range(m)

]for _ in range(n)

]ans[0][0][0], ans[0][0][1] = g[0][0], g[0][0]

for i in range(1, n):

ans[i][0][0] = ans[i - 1][0][0] * g[i][0]

ans[i][0][1] = ans[i - 1][0][1] * g[i][0]

for j in range(1, m):

ans[0][j][0] = ans[0][j - 1][0] * g[0][j]

ans[0][j][1] = ans[0][j - 1][1] * g[0][j]

for i in range(1, n):

for j in range(1, m):

a = ans[i - 1][j][0] * g[i][j]

b = ans[i - 1][j][1] * g[i][j]

c = ans[i][j - 1][0] * g[i][j]

d = ans[i][j - 1][1] * g[i][j]

ans[i][j][0] = min(a, b, c, d)

ans[i][j][1] = max(a, b, c, d)

if ans[n - 1][m - 1][1] >= 0:

return ans[n - 1][m - 1][1] % mod

return -1

Leetcode 1594 矩陣的最大非負積

給你乙個大小為 rows x cols 的矩陣 grid 最初,你位於左上角 0,0 每一步,你可以在矩陣中 向右 或 向下 移動。在從左上角 0,0 開始到右下角 rows 1,cols 1 結束的所有路徑中,找出具有 最大非負積 的路徑。路徑的積是沿路徑訪問的單元格中所有整數的乘積。返回 最大非...

LeetCode1594 矩陣的最大非負積

給你乙個大小為 rows x cols 的矩陣 grid 最初,你位於左上角 0,0 每一步,你可以在矩陣中 向右 或 向下 移動。在從左上角 0,0 開始到右下角 rows 1,cols 1 結束的所有路徑中,找出具有 最大非負積 的路徑。路徑的積是沿路徑訪問的單元格中所有整數的乘積。返回 最大非...

LeetCode 矩陣的最大非負數乘積

給你乙個大小為rowsxcols的矩陣grid.最初,你位於左上角 0,0 每一步,你可以 在矩陣中向右或向下移動.在從左上角 0,0 開始到右下角 rows 1,cols 1 結束 的所有路徑中,找出具有最大非負積的路徑.路徑的積是沿路徑訪問的單元格中所有 整數的乘積.返回最大非負積對10 9 7...