題目描述
https://leetcode-cn.com/problems/unique-paths/
思路
我看到這個(gè)題一下子想到的思路是組合數(shù),這不就是初中數(shù)學(xué)的填空題嘛,實(shí)際相當(dāng)于機(jī)器人總共走了 m + n - 2步,其中 m - 1 步向右走,n - 1 步向下走。那么從 m + n - 2步里挑m-1步有幾種挑法,c(m+n-2,m-1)啊。但是直接這樣實(shí)現(xiàn),有一個(gè)樣例沒過,我也不知道為啥,可能是大數(shù)溢出問題,不想追究了。
下面說說dp思路。
image.png
原來這跟之前那道 Climbing Stairs 很類似,那道題是說可以每次能爬一格或兩格,問到達(dá)頂部的所有不同爬法的個(gè)數(shù)。而這道題是每次可以向下走或者向右走,求到達(dá)最右下角的所有不同走法的個(gè)數(shù)。那么跟爬梯子問題一樣,需要用動(dòng)態(tài)規(guī)劃 Dynamic Programming 來解,可以維護(hù)一個(gè)二維數(shù)組 dp,其中 dp[i][j] 表示到當(dāng)前位置不同的走法的個(gè)數(shù),然后可以得到狀態(tài)轉(zhuǎn)移方程為: dp[i][j] = dp[i - 1][j] + dp[i][j - 1],這里為了節(jié)省空間,使用一維數(shù)組 dp,一行一行的刷新也可以。
代碼
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> dp(m, 1);
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[j] = dp[j] + dp[j-1];
}
}
return dp[m-1];
}
};