一篇搞定动态规划之不同路径

开发 前端
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

[[426767]]

本文转载自微信公众号「我好困啊」,作者我好困啊。转载本文请联系我好困啊公众号。

题目说明

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

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

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

图片来源leetcode

示例1:

输入:m = 3, n = 7 
输出:28 
  • 1.
  • 2.

示例2:

输入:m = 3, n = 2 
输出:3 
解释: 
从左上角开始,总共有 3 条路径可以到达右下角。 
1. 向右 -> 向下 -> 向下 
2. 向下 -> 向下 -> 向右 
3. 向下 -> 向右 -> 向下 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

提示:

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

解题思路

利用动态规划算法

1.定义状态f[i][j]为到达(i,j)位置的路径条数

2.f[0][0] = 1,那么最终m*n的表格,到达右下角的路径条数即为f[m-1][n-1]中的值

3.每次移动情况,如果当前位置:

向下:f[i][j] = f[i-1][j]

向右: f[i][j] = f[i][j-1]

向下,向右:f[i][j] = f[i-1][j]+f[i][j-1]

如果你还不理解的话,观看一下流转图:

以2*2的网格为例

说明,从f[0][0]出发,那么开始时,节点f[0][0]=1,

节点f[0][1]只能由于f[0][0]向右移动得到,即 f[0][1]=f[0][0]

节点f[1][0]同理,只能f[0][0]下移得到。即 f[1][0]=f[0][0]

节点f[1][1],可以由于f[0][1]向下移动,f[1][0]向右移动。两种移动方式得到。即:f[1][1] = f[0][1] + f[1][0]

最后,f[m-1][n-1],右下角的位置即为最终结果

如果你还不理解的话,建议你手动画一下2*3的表格移动状态的转移过程。

代码实现

 1func uniquePaths(m int, n intint { 
 2    f := make([][]int,m) 
 3    for i:= range f{ 
 4        f[i] = make([]int,n) 
 5    } 
 6    f[0][0] = 1 
 7    for i:=0;i<m;i++ { 
 8        for j:=0;j<n;j++ { 
 9            if i>0 && j>0 { //可以向下,向右移动 
10                f[i][j] = f[i-1][j] + f[i][j-1] 
11            }else if i>0 { //可以向下移动 
12                f[i][j] = f[i-1][j] 
13            }else if j>0 { //可以向右移动 
14                f[i][j] = f[i][j-1] 
15            } 
16        } 
17    } 
18    //循环结束后,走到了终点 
19    return f[m-1][n-1] 
20} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

复杂度分析

  • 时间复杂度:O(m*n)
  • 空间复杂度: O(m*n)

 

责任编辑:武晓燕 来源: 我好困啊
相关推荐

2022-01-04 11:31:15

不同路径DP

2021-09-06 06:31:40

理解动态规划

2020-03-20 08:30:56

手机移动端适配

2021-02-20 10:06:14

语言文件操作

2021-01-13 08:40:04

Go语言文件操作

2020-08-11 09:06:42

监控系统选型

2020-02-28 11:29:00

ElasticSear概念类比

2019-07-22 08:35:32

Java垃圾回收

2022-10-21 08:29:50

监控CMDB架构

2022-05-28 15:59:55

PythonPandas数据可视化

2024-04-17 13:21:02

Python匿名函数

2021-05-15 10:16:14

Python匿名函数

2018-12-18 11:20:28

前端模块化JavaScript

2021-03-06 10:05:03

Python函数变量

2021-11-10 09:19:41

PythonShutil模块

2019-02-26 15:22:14

MySQL命令数据库

2023-01-06 18:50:55

架构应用

2021-11-17 10:11:08

PythonLogging模块

2022-03-30 10:51:40

JavaScript性能调优

2020-03-31 08:37:31

递归单链表反转
点赞
收藏

51CTO技术栈公众号