一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步. 机器人试图达到网格的右下角(在下图中标记为“Finish”)
问总共有多少条不同的路径?
说明: m和n 的值均不超过100
示例1:
输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例2:
输入: m = 7, n = 3 输出: 28
解法一: 动态规划
我们令dp[i][j]是到达i, j 最多路径
动态方程: dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]
注意,对于第一行dp[0] [j]或者第一列dp[i][0],由于都是在边界,所以只能为1
时间复杂度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上结果如下
上面就是动态规划下不同路径的算法思想和代码,可以直接运行,希望对大家有所帮助!!!
原文地址:https://www.cnblogs.com/guohai-stronger/p/11818166.html
时间: 2024-10-18 20:48:11