目录

题目

思路

Code


题目

园区某部门举办了Family Day,邀请员工及其家属参加;将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径

2024华为od机试C卷【园区参观路径】Python 实现_Python


编辑



输入描述

第一行为园区的长和宽:


后面每一行表示该园区是否可以参观,0表示可以参观,1表示不能参观



输出描述

输出为不同的路径数量


示例1:

输入:

3 3
0 0 0

0 1 0
0 0 0
输出:

2
 

思路

1:leetcode原题:LeetCode 63 - 不同路径 II (Python3|Go) Unique Paths II - 知乎

2:设 dp[i][j] 表示从 (0, 0) 到 (i - 1, j - 1) 的不同路径数。

这里 i 和 j 都比对应格子的下标大 1 ,是为了方便处理第一行和第一列的情况,避免越界判断

初始状态:dp[i][j] = 0; dp[0][1] = 1 。

注意,这里也可以令 dp[1][0] = 1 ,但两者不能同时为 1 。

这样初始化也是为了方便后续处理,并能转移出 dp[1][1] = 1 。

状态转移方程:

  1. obstacleGrid[i - 1][j - 1] == 0: dp[i][j] = dp[i - 1][j] + dp[i][j - 1] ,即可以从上边或左边的格子走过来
  2. obstacleGrid[i - 1][j - 1] == 1: dp[i][j] = 0 ,实际上不用处理,因为初始化时就是 0

最后, dp[m][n] 就是从 (0, 0) 到 (m - 1, n - 1) 的不同路径数。

时间复杂度:O(mn)

  • 需要遍历 dp 全部 O(mn) 个状态

空间复杂度:O(mn)

  • 需要维护一个大小为 O(mn) 的数组 dp