1. 程式人生 > >領釦刷題--62. 不同路徑

領釦刷題--62. 不同路徑

題目描述如下:

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

問總共有多少條不同的路徑?

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?

說明:m 和 的值均不超過 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];     } };

做完了這道題之後可以去嘗試下下一道題。