不一样路径--动态规划

一个机器人位于一个 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上结果以下

 

上面就是动态规划下不一样路径的算法思想和代码,能够直接运行,但愿对你们有所帮助!!!

相关文章
相关标签/搜索