题目
解法:动态规划
非常直观的动态规划
class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
m,n = len(matrix),len(matrix[0])
dp = [[float('inf')]*n for _ in range(m)]
dp[0] = matrix[0]
for i in range(1,m):
for j in range(n):
left = dp[i-1][j-1] if j > 0 else float('inf')
above = dp[i-1][j]
right = dp[i-1][j+1] if j < m-1 else float('inf')
dp[i][j] = min(left,above,right) + matrix[i][j]
# print(dp)
return min(dp[-1])
解法2:加了空间压缩
class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
m,n = len(matrix),len(matrix[0])
prev_row_min = matrix[0]
for i in range(1,m):
# print(prev_row_min)
curr_row_min = [float('inf')]*n
for j in range(n):
left = prev_row_min[j-1] if j > 0 else float('inf')
above = prev_row_min[j]
right = prev_row_min[j+1] if j < m-1 else float('inf')
curr_row_min[j] = min(left,above,right) + matrix[i][j]
prev_row_min = curr_row_min
return min(prev_row_min)
follow up
有一道跟这题本质差不多但更难的题目,这道相当于是那道的简化版本
1937. Maximum Number of Points with Cost