classSolution:defminFallingPathSum(self, matrix: List[List[int]])->int:
m, n =len(matrix),len(matrix[0])
dp =[[0]*n for _ inrange(m)]
mini = inf
for i inrange(m):for j inrange(n):if i ==0:
dp[i][j]= matrix[i][j]else:
dp[i][j]= dp[i-1][j]if j >0:
dp[i][j]=min(dp[i][j], dp[i-1][j-1])if j < n-1:
dp[i][j]=min(dp[i][j], dp[i-1][j+1])
dp[i][j]+= matrix[i][j]if i == m-1:
mini =min(mini, dp[i][j])return mini
Java
classSolution{publicintminFallingPathSum(int[][] matrix){if(matrix.length ==0|| matrix[0].length ==0){return0;}int m = matrix.length, n = matrix[0].length;int[][] dp =newint[m][n];// 到达i,j的最小路径和int min =Integer.MAX_VALUE;for(int i =0; i < n;++i){// 首行
dp[0][i]= matrix[0][i];if(m ==1){
min =Math.min(min, dp[0][i]);}}for(int i =1; i < m;++i){for(int j =0; j < n;++j){int preMin = dp[i -1][j];if(j -1>=0){
preMin =Math.min(preMin, dp[i -1][j -1]);}if(j +1< n){
preMin =Math.min(preMin, dp[i -1][j +1]);}
dp[i][j]= preMin + matrix[i][j];if(i == m -1){
min =Math.min(min, dp[i][j]);}}}return min;}}