题目:​​原题链接​(中等)

标签:贪心算法、动态规划

解法

时间复杂度

空间复杂度

执行用时

Ans 1 (Python)

O ( N × M )

O ( N × M )

44ms (98%)

Ans 2 (Python)

Ans 3 (Python)

解法一(动态规划):

class Solution:
def maxProductPath(self, grid: List[List[int]]) -> int:
if not grid or not grid[0]:
return -1

N1, N2 = len(grid), len(grid[0])
dp = [[(None, None)] * N2 for _ in range(N1)]
if grid[0][0] > 0:
dp[0][0] = (grid[0][0], None)
elif grid[0][0] == 0:
dp[0][0] = (0, 0)
else:
dp[0][0] = (None, grid[0][0])

# 处理第1列
for i in range(1, N1):
if grid[i][0] > 0:
n1 = dp[i - 1][0][0] * grid[i][0] if dp[i - 1][0][0] is not None else None
n2 = dp[i - 1][0][1] * grid[i][0] if dp[i - 1][0][1] is not None else None
dp[i][0] = (n1, n2)
elif grid[i][0] == 0:
dp[i][0] = (0, 0)
else:
n1 = dp[i - 1][0][1] * grid[i][0] if dp[i - 1][0][1] is not None else None
n2 = dp[i - 1][0][0] * grid[i][0] if dp[i - 1][0][0] is not None else None
dp[i][0] = (n1, n2)

# 处理第1行
for j in range(1, N2):
if grid[0][j] > 0:
n1 = dp[0][j - 1][0] * grid[0][j] if dp[0][j - 1][0] is not None else None
n2 = dp[0][j - 1][1] * grid[0][j] if dp[0][j - 1][1] is not None else None
dp[0][j] = (n1, n2)
elif grid[0][j] == 0:
dp[0][j] = (0, 0)
else:
n1 = dp[0][j - 1][1] * grid[0][j] if dp[0][j - 1][1] is not None else None
n2 = dp[0][j - 1][0] * grid[0][j] if dp[0][j - 1][0] is not None else None
dp[0][j] = (n1, n2)

# 处理其他部分
for i in range(1, N1):
for j in range(1, N2):
if grid[i][j] > 0:
n11 = dp[i - 1][j][0] * grid[i][j] if dp[i - 1][j][0] is not None else None
n12 = dp[i][j - 1][0] * grid[i][j] if dp[i][j - 1][0] is not None else None
if n11 is not None and n12 is not None:
n1 = max(n11, n12)
elif n11 is not None:
n1 = n11
elif n12 is not None:
n1 = n12
else:
n1 = None
n21 = dp[i - 1][j][1] * grid[i][j] if dp[i - 1][j][1] is not None else None
n22 = dp[i][j - 1][1] * grid[i][j] if dp[i][j - 1][1] is not None else None
if n21 is not None and n22 is not None:
n2 = min(n21, n22)
elif n21 is not None:
n2 = n21
elif n22 is not None:
n2 = n22
else:
n2 = None
# print("(", i, ",", j, ")", grid[i][j], "->", n11, n12, n21, n22)
dp[i][j] = (n1, n2)
elif grid[i][j] == 0:
dp[i][j] = (0, 0)
else:
n11 = dp[i - 1][j][1] * grid[i][j] if dp[i - 1][j][1] is not None else None
n12 = dp[i][j - 1][1] * grid[i][j] if dp[i][j - 1][1] is not None else None
if n11 is not None and n12 is not None:
n1 = max(n11, n12)
elif n11 is not None:
n1 = n11
elif n12 is not None:
n1 = n12
else:
n1 = None

n21 = dp[i - 1][j][0] * grid[i][j] if dp[i - 1][j][0] is not None else None
n22 = dp[i][j - 1][0] * grid[i][j] if dp[i][j - 1][0] is not None else None
if n21 is not None and n22 is not None:
n2 = min(n21, n22)
elif n21 is not None:
n2 = n21
elif n22 is not None:
n2 = n22
else:
n2 = None
# print("(", i, ",", j, ")", grid[i][j], "->", n11, n12, n21, n22, "->", n1, n2)
dp[i][j] = (n1, n2)

# for l in dp:
# print(l)

if dp[-1][-1][0] is not None:
return dp[-1][-1][0] % (10 ** 9 + 7)
else:
return -1