题目:
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
解析:
这很明显是一个动态规划的问题,因为只能向下向右移动,因此只要算出每个格子会出现的最小值就行,最后返回右下角格子的数值
特殊情况考虑:
因为只能向下和向右移动,因此第一行格子的值只能通过其左边的格子移动过来;第一列格子的值只能通过其上边的格子移动过来。
代码:
1 class Solution { 2 public int minPathSum(int[][] grid) { 3 int rows = grid.length; 4 int cols = grid[0].length; 5 if(grid==null || rows==0 || cols==0) return 0; 6 7 int[][] dp = new int[rows][cols]; 8 dp[0][0] = grid[0][0]; 9 for(int i=1;i<rows;++i){ 10 dp[i][0]=dp[i-1][0]+grid[i][0]; 11 } 12 for(int j=1;j<cols;++j){ 13 dp[0][j]=dp[0][j-1]+grid[0][j]; 14 } 15 for (int i = 1; i < rows; i++) { 16 for (int j = 1; j < cols; j++) { 17 dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; 18 } 19 } 20 return dp[rows - 1][cols - 1]; 21 } 22 }