给定一个包含非负整数的m * n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总合为最小.
说明: 每次只能向下或者向右移动一下.
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
解法一: 动态规划
思想
因为最近在做动态规划的专题,所以用动态规划的思想来解决本题目:
我们新建一个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]; }
运行结果
以上就是动态规划的方式解决最短路径和,在日后开发过程中,当讲到一种算法思想时,可以用于改题目,会增加新解(因本人目前在做动态规划的专题), 希望对大家有所帮助!!!