给定一个包含非负整数的m * n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总合为最小.

说明: 每次只能向下或者向右移动一下.

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 13111 的总和最小。

解法一: 动态规划

思想

因为最近在做动态规划的专题,所以用动态规划的思想来解决本题目:
我们新建一个dp数组,用来保存每走一步的最短路径,但是最后一个数值也就是最后一个元素肯定是有的;
我们利用递推的公式:
dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
即可,思想比较特殊,但是找到规律后还是很好理解的.

代码

public int minPathSum(int[][] grid) {

    int[][] dp = new int[grid.length][grid[0].length];
    for (int i = grid.length - 1; i >= 0; i--) {
        for (int j = grid[0].length - 1; j >= 0; j--) {
            if(i == grid.length - 1 && j != grid[0].length - 1)
              dp[i][j] = grid[i][j] +  dp[i][j + 1];
            else if(j == grid[0].length - 1 && i != grid.length - 1)
              dp[i][j] = grid[i][j] + dp[i + 1][j];
            else if(j != grid[0].length - 1 && i != grid.length - 1)
              dp[i][j] = grid[i][j] + Math.min(dp[i + 1][j], dp[i][j + 1]);
            else
              dp[i][j] = grid[i][j];
        }
    }
    return dp[0][0];
}

运行结果

以上就是动态规划的方式解决最短路径和,在日后开发过程中,当讲到一种算法思想时,可以用于改题目,会增加新解(因本人目前在做动态规划的专题), 希望对大家有所帮助!!!

01-08 18:56