1. 程式人生 > 其它 >S3物件儲存上傳資料夾

S3物件儲存上傳資料夾

技術標籤:動態規劃leetcode

62. 不同路徑

一個機器人位於一個 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步向下走即可

  • formula
  • formula
    def uniquePaths(self, m: int, n: int) -> int:
        return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1));