前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >62. 不同路径

62. 不同路径

原创
作者头像
Michel_Rolle
发布2025-02-27 16:15:26
发布2025-02-27 16:15:26
10700
代码可运行
举报
运行总次数:0
代码可运行

link

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

 Example 1:

代码语言:javascript
代码运行次数:0
复制
Input: m = 3, n = 7
Output: 28

提示

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10 ^ 9

/**

1. 定义状态 dp[i][j] 为当前 i*j 的路径总数

2. 递推方程 dp[i][j] = dp[i-1][j]+dp[i][j-1]

3. 状态初始化 dp[i][1]=1 dp[1][j]=1

4. 最终结果  dp[m-1][n-1]

5. 优化每次仅用到 dp[i-1][j] 和 dp[i][j-1] 所以可将dp优化为一个一维数组中:cur[j] += cur[j-1]

   a) cur 长度取 n 防止溢出

   b) 方程为 cur[j] += cur[j-1] 等价于 cur[j] = cur[j] + cur[j-1] cur[i]每行遍历只更新一次,也就是说cur[j]原有的值代表的是上一行p[i-1],[j]的值,而cur[j-1] 是在本行遍历刚更新过的值因此是dp[i][j-1]的值!

*/

代码语言:javascript
代码运行次数:0
复制
func uniquePaths(m int, n int) int {
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
        dp[i][0] = 1
    }
    for j := 0; j < n; j++ {
        dp[0][j] = 1
    }

	for i := 1; i < m; i++ {
		for j := 1; j < n; j++ {
			// 到达 (i,j) 格子的路径数目,等于
			// 到达 上方格子 和 左边格子 路径数之和
			dp[i][j] = dp[i-1][j] + dp[i][j-1]
		}
	}

	return dp[m-1][n-1]
}


func uniquePaths2(m int, n int) int {
	cur := make([]int,n)
	for i:=0;i<n;i++{
		cur[i] = 1
	}
	for i:=1;i<m;i++{
		for j:=1;j<n;j++{
			cur[j] += cur[j-1]
		}
	}
	return cur[n-1]
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档