DP
Min[ i, j] = Min( Min[i - 1][j] + grid[i][j], Min[i][j - 1] + grid[ i ][ j ]);
public int minPathSum(int[][] grid) {
// Start typing your Java solution below [[1]]
// DO NOT write main() function
int[][] M = new int[grid.length][grid[0].length];
M[0][0] = grid[0][0];
for(int i = 0; i < M.length; i++) {
for(int j = 0; j < M[0].length; j++) {
int up = Integer.MAX_VALUE;
int left = Integer.MAX_VALUE;
if(i > 0) up = M[i-1][j] + grid[i][j];
if(j > 0) left = M[i][j-1] + grid[i][j];
if(i != 0 || j != 0) M[i][j] = (up > left ? left : up) ;
}
}
return M[M.length-1][M[0].length-1];
}