1. 程式人生 > 其它 >【leetcode】62不同路徑(動態規劃+組合)

【leetcode】62不同路徑(動態規劃+組合)

技術標籤:leetcodec++動態規劃leetcode

要成為更好的人,今天小室更dy了哦

題目

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。
問總共有多少條不同的路徑?

示例 1:

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

示例2:

輸入:m = 3, n = 2
輸出:3

解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 3:

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

示例 4:

輸入:m = 3, n = 3
輸出:6

提示:

  1. <= m, n <= 100
  2. 題目資料保證答案小於等於 2 * 109

解答

中等難度中罕見的簡單題,碰到就是賺到

兩種方法:組合或者動態規劃

首先是組合,也是很容易想到的,必然要向左m-1次,向下n-1次,要做的就是有多少種排法,顯而易見,是C((m-1),(m+n-2))種
下面問題來了,組合在C++中應該如何實現
我們來看一下組合公式
在這裡插入圖片描述
第一反應其實是公式的最後一步x從1加到m-1,y從1加到n-1然後算(x+y)/(x*y),但是還有簡單的,看到公式的倒數第二步,用x=n,y=1,兩個同時++,一直到y=m-1。

不知道有沒有直接的函式可以呼叫的,能用就更好了

int uniquePaths(int m, int n) {
        long long ans = 1;
        for (int x = n, y = 1; y < m; ++x, ++y) {
            ans = ans * x / y;
        }
        return ans;
    }

法二是動態規劃,最近演算法課正在講動態規劃,感覺初識精妙絕倫,看了幾個又有點套路,等結課了再做一個總結
主要是把最優子結構和性質理出來
用f(i,j)表示從(0,0)到點(i,j)的路徑個數
在這裡插入圖片描述

網上沒找到圖,自己去word畫了一個公式,給俺畫餓了

int uniquePaths(int m, int n) {
        vector<vector<int>> f(m, vector<int>(n));
        for (int i = 0; i < m; ++i) {
            f[i][0] = 1;
        }
        for (int j = 0; j < n; ++j) {
            f[0][j] = 1;
        }
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                f[i][j] = f[i - 1][j] + f[i][j - 1];
            }
        }
        return f[m - 1][n - 1];
    }

動態規劃部分程式碼抄了官方

over~洗漱完再聽個聽力就可以睡覺了