1
# Runtime: 63 ms (Top 56.0%) | Memory: 16.84 MB (Top 17.4%)5
def maxProductPath(self, grid: List[List[int]]) -> int:6
m, n = len(grid), len(grid[0])10
"""Return maximum & minimum products ending at (i, j)."""12
return grid[0][0], grid[0][0]17
mx1, mn1 = fn(i - 1, j) # from top18
mx2, mn2 = fn(i, j - 1) # from left19
mx, mn = max(mx1, mx2) * grid[i][j], min(mn1, mn2) * grid[i][j]20
return (mx, mn) if grid[i][j] > 0 else (mn, mx)22
mx, _ = fn(m - 1, n - 1)23
return -1 if mx < 0 else mx % 1_000_000_007