S3物件儲存上傳資料夾
阿新 • • 發佈:2020-12-12
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。問總共有多少條不同的路徑?
示例1:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
示例2:
輸入: m = 7, n = 3 輸出: 28
提示:
1 <= m, n <= 100
- 題目資料保證答案小於等於
2 * 10 ^ 9
基本思路:動態規劃,假設從起點出發,向右,那麼轉換成m*(n-1)的問題;向下,那麼轉換成(m-1)*n的問題。
- dp[i][j]表示i*j大小的網格的不同路徑的個數
- dp[i][j]=dp[i-1][j]+dp[i][j-1],表示的是i*j的網格的路徑數=向右的dp[i][j-1]+向下的dp[i-1][j];
int uniquePaths(int m, int n) { vector<vector<int>> dp(m+1,vector<int>(n+1,1)); for(int i=2;i<=m;i++){ for(int j=2;j<=n;j++){ dp[i][j]=dp[i-1][j]+dp[i][j-1]; } } return dp[m][n]; }
基本思路: 同上,狀態壓縮,對於方塊中的任意位置<i,j>可以看作是從上面過來的dp[i-1][j]和從左邊過來的dp[i][j-1],至於其左邊和上邊有關,有點像楊輝三角問題。
int uniquePaths(int m, int n) { vector<int> dp(n+1,1); for(int i=2;i<=m;i++){ for(int j=2;j<=n;j++){ dp[j]=dp[j-1]+dp[j]; } } return dp[n]; }
基本思路: 組合問題,從起點到終點,一定需要走m+n-2步,從中選出m-1步向下走即可
def uniquePaths(self, m: int, n: int) -> int:
return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1));