Problem
Given an n x n array of integers matrix, return the minimum sum of any falling path through matrix.
A falling path starts at any element in the first row and chooses the element in the next row that is either directly below or diagonally left/right. Specifically, the next element from position (row, col) will be (row + 1, col - 1), (row + 1, col), or (row + 1, col + 1).
Algorithm
Dynamic Programming (DP). Define the state dp[i][j] as the minimum falling path to the point at (i-row, j-column). dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1]) + matrix[i][j].
Code
python3
class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
r_size = len(matrix)
if r_size == 1:
return min(matrix[0])
c_size = len(matrix[0])
minSum = [[0] * c_size for r in range(r_size+1)]
for r in range(1, r_size+1):
print(r)
for c in range(c_size):
minSum[r][c] = minSum[r-1][c] + matrix[r-1][c]
if c > 0 and minSum[r][c] > minSum[r-1][c-1] + matrix[r-1][c]:
minSum[r][c] = minSum[r-1][c-1] + matrix[r-1][c]
if c < c_size-1 and minSum[r][c] > minSum[r-1][c+1] + matrix[r-1][c]:
minSum[r][c] = minSum[r-1][c+1] + matrix[r-1][c]
return min(minSum[r_size])