class Solution {
public int minFallingPathSum(int[][] A) {
if(A== null|| A.length==0 || A[0].length ==0 ){
return 0;
}
int n = A.length ;
int m = A[0].length;
int[][] dp = new int[n][m];
// first row calculation
for(int i = 0; i<m; i++){
dp[0][i] =A[0][i];
}
for(int i = 1; i<n; i++){
for(int j = 0; j<m; j++ ){
//first column scenario
if(j == 0){
dp[i][j]= Math.min(dp[i-1][j],dp[i-1][j+1])+A[i][j];
}
//last column scenario
else if (j ==m-1){
dp[i][j]=Math.min(dp[i-1][j-1],dp[i-1][j])+A[i][j];
}
//non-border scenario
else{
dp[i][j]=Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i-1][j+1]))+A[i][j];
}
}
}
int min = Integer.MAX_VALUE;
for(int j = 0; j<m; j++){
if(dp[n-1][j]<min){
min = dp[n-1][j];
}
}
return min;
}
}