【leetcode】62不同路徑(動態規劃+組合)
阿新 • • 發佈:2020-12-10
題目
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。
問總共有多少條不同的路徑?
示例 1:
輸入:m = 3, n = 7
輸出:28
示例2:
輸入:m = 3, n = 2
輸出:3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 3:
輸入:m = 7, n = 3
輸出:28
示例 4:
輸入:m = 3, n = 3
輸出:6
提示:
- <= m, n <= 100
- 題目資料保證答案小於等於 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~洗漱完再聽個聽力就可以睡覺了