Question:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Analysis:
给出一个由非负数构成的 m * n 的网格,找出里面一条从左上角到右下角的最短路径。
注意:在每次行走的过程中,你只能往下或往右走。
思路:
1. 因为之前写过迷宫的程序,所以首先想到用迷宫的思路即由于只能往右或者往下走,而根据贪心算法,每次我们肯定选择一个代价最小的方向走。所以一般情况下只有一种选择,但是当往右走往下走代价相同时,我们不知道接下来该往哪个方向走代价会最小,所以需要用栈记录此时的信息,得到所有可能的路径后,我们返回代价最小的那一条即可。
思路肯定是没错的,但是尼玛程序老实出错%>_<%。
2. 参考了一点网上的思路,用动态规划,申请一块额外的空间,这样除了第一行和第一列只有一种来源之外,其他的都可能来源于左方或上方,因此用动态规划可以很容易的解决。
Answer:
Dynamic Programing。
public class Solution { public int minPathSum(int[][] rid) { if(rid == null || (rid.length == 0 && rid[0].length == 0)) return 0; if(rid.length == 1 && rid[0].length == 1) return rid[0][0]; int row = rid.length, col = rid[0].length; int[][] dp = new int[row][col]; dp[0][0] = rid[0][0]; for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { if(i == 0 && j == 0) continue; else if(i == 0 && j != 0) dp[i][j] = dp[i][j-1] + rid[i][j]; else if(j == 0 && i != 0) dp[i][j] = dp[i-1][j] + rid[i][j]; else { dp[i][j] = Math.min(dp[i][j-1], dp[i-1][j]) + rid[i][j]; } } } return dp[row-1][col-1]; } }