一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。算法
機器人每次只能向下或者向右移動一步. 機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)app
問總共有多少條不一樣的路徑?優化
說明: m和n 的值均不超過100spa
示例1:3d
輸入: m = 3, n = 2 輸出: 3 解釋: 從左上角開始,總共有 3 條路徑能夠到達右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例2:code
輸入: m = 7, n = 3 輸出: 28
解法一: 動態規劃blog
咱們令dp[i][j]是到達i, j 最多路徑class
動態方程: dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]im
注意,對於第一行dp[0] [j]或者第一列dp[i][0],因爲都是在邊界,因此只能爲1d3
時間複雜度O(m * n), 空間複雜度爲S(m * n)
優化下,因此咱們只須要每次計算dp[i - 1][ j ]與dp[ i ][j - 1],咱們能夠先初始化第一行,第一列全部元素爲1,其餘待定便可
代碼以下:
func uniquePaths(_ m: Int, _ n: Int) -> Int { guard m > 0 ,n > 0 else { return 0 } var dp = [[Int]]() /***建立第一行第一列元素爲1*/ for i in 0 ..< m { var row = [Int]() for j in 0 ..< n { if i == 0 { row.append(1) } else { if j == 0 { row.append(1) } } } dp.append(row) } /*********************/ //從第二列第二行開始 for i in 1..<m { for j in 1..<n { dp[i].append(dp[i - 1][j] + dp[i][j - 1]) } } //返回最右下標 return dp[m - 1][n - 1] } uniquePaths(3, 7)
執行完結果以下
在leetCode上結果以下
上面就是動態規劃下不一樣路徑的算法思想和代碼,能夠直接運行,但願對你們有所幫助!!!