class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
n = len(matrix)
dp = [i for i in matrix[0]]
for i in range(1, n):
for j in range(n):
if j == 0:
pre = dp[j]
dp[j] = min(dp[j], dp[j + 1]) + matrix[i][j]
elif j == n - 1:
dp[j] = min(dp[j], pre) + matrix[i][j]
else:
cur = dp[j]
dp[j] = min(pre, dp[j], dp[j + 1]) + matrix[i][j]
pre = cur
return min(dp)
120. 三角形最小路径和(Medium)
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
n = len(triangle)
f = [[0] * n for _ in range(n)]
f[0][0] = triangle[0][0]
for i in range(1, n):
f[i][0] = f[i - 1][0] + triangle[i][0]
for j in range(1, i):
f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j]
f[i][i] = f[i - 1][i - 1] + triangle[i][i]
return min(f[n - 1])