不一樣路徑--動態規劃

一個機器人位於一個 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上結果以下

 

上面就是動態規劃下不一樣路徑的算法思想和代碼,能夠直接運行,但願對你們有所幫助!!!

相關文章
相關標籤/搜索