1. 程式人生 > >leetcode 62 不同的路徑

leetcode 62 不同的路徑

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

問總共有多少條不同的路徑?

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?

說明:m 和 的值均不超過 100。

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3
輸出: 28

       動態規劃,用一個數組來儲存每個格子上的路徑數量,規則是:每個格子上的數量為上面格子的數量加上左邊格子的數量(因為機器人只能往又走和往下走),所以一定是通過上面一個格子或者左邊一個格子走到當前格子的,因此當前格子的數量為從左邊走過來的路徑數+從上面走過來的路徑數。我們可以維護一個二維陣列dp,其中dp[i][j]表示到當前位置不同的走法的個數,然後可以得到遞推式為: dp[i][j] = dp[i - 1][j] + dp[i][j - 1],這裡為了節省空間,我們使用一維陣列dp,一行一行的重新整理也可以。

public int uniquePaths(int m, int n) {
    int[] dp = new int[n];
    for(int i = 0; i < n; i++){
        dp[i] = 1;
    }
    for(int i = 1; i < m; i++){
        for(int j = 1; j < n; j++){
            dp[j] += dp[j - 1];
        }
    }
    return dp[n - 1];
}