領釦刷題--62. 不同路徑
題目描述如下:
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
問總共有多少條不同的路徑?
例如,上圖是一個7 x 3 的網格。有多少可能的路徑?
說明:m 和 n 的值均不超過 100。
示例 1:
輸入: m = 3, n = 2 輸出: 3 解釋: 從左上角開始,總共有 3 條路徑可以到達右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
思路分析:
這是一道明顯,很規矩的動歸題,思路的重點就是找出狀態轉移的公式,由於規定只能向下或是向右邊移動,所以在確定了一個點之後,要想到達這一點則必然會經過(m-1,n)和(m,n-1)兩點,所以我們只需要去研究到(m-1,n)有幾條路徑和到(m,n-1)有幾條路徑就可以了,這樣動態轉移方程就可以寫出來了
dp[m][n]=dp[m-1][n]+dp[m][n-1]
借用遞迴來實現,由於在第一行的每一列都只有一種到達方式,每一行的第一個都只有一種到達方式,所以初始化dp,遞迴的終止條件也可以得到了,結合下面的程式碼:
程式語言c++:
class Solution { public: int dpl(vector<vector<int>>&dp,int m,int n)//遞迴函式 { if(dp[m][n]!=0)//終止條件 return dp[m][n]; else//繼續尋找 return dp[m][n]=dpl(dp,m-1,n)+dpl(dp,m,n-1); } int uniquePaths(int m, int n) { vector<vector<int>>dp(m,vector<int>(n,0));//用於儲存到m,n點有多少種路徑 //vector<int>dp[m]; //for(int i=0;i<nums.size();i++) //dp[i].resize(m); //init dp的初始化 for(int i=0;i<dp.size();i++) dp[i][0]=1; for(int j=0;j<dp[0].size();j++) dp[0][j]=1; dpl(dp,m-1,n-1); return dp[m-1][n-1]; } };
做完了這道題之後可以去嘗試下下一道題。