3665.统计镜子反射路径数目:三个动态规划数组
【LetMeFly】3665.统计镜子反射路径数目:三个动态规划数组
力扣题目链接:https://leetcode.cn/problems/twisted-mirror-path-count/
给你一个 m x n 的二进制网格 grid,其中:
grid[i][j] == 0表示一个空格子。grid[i][j] == 1表示一面镜子。
一个机器人从网格的左上角 (0, 0) 出发,想要到达右下角 (m - 1, n - 1)。它只能向 右 或向 下 移动。如果机器人试图移入一个有镜子的格子,它会在进入该格子前被 反射:
- 如果它试图向 右 移动进入镜子,它会被转向 下 方,并移动到镜子正下方的格子里。
- 如果它试图向 下 移动进入镜子,它会被转向 右 方,并移动到镜子正右方的格子里。
如果这次反射会导致机器人移动到网格边界之外,则该路径被视为无效,不应被计数。
返回从 (0, 0) 到 (m - 1, n - 1) 不同的有效路径数量。
由于答案可能非常大,请将其返回对 109 + 7 取模 的结果。
注意:如果一次反射将机器人移动到一个有镜子的格子,机器人会立即再次被反射。这次反射的方向取决于它进入该镜子的方向:如果它是向右移动进入的,它将被转向下方;如果它是向下移动进入的,它将被转向右方。
示例 1:
输入: grid = [[0,1,0],[0,0,1],[1,0,0]]
输出: 5
解释:
| 编号 | 完整路径 |
|---|---|
| 1 | (0, 0) → (0, 1) [M] → (1, 1) → (1, 2) [M] → (2, 2) |
| 2 | (0, 0) → (0, 1) [M] → (1, 1) → (2, 1) → (2, 2) |
| 3 | (0, 0) → (1, 0) → (1, 1) → (1, 2) [M] → (2, 2) |
| 4 | (0, 0) → (1, 0) → (1, 1) → (2, 1) → (2, 2) |
| 5 | (0, 0) → (1, 0) → (2, 0) [M] → (2, 1) → (2, 2) |
-
[M]表示机器人试图进入一个有镜子的格子但被反射了。
示例 2:
输入: grid = [[0,0],[0,0]]
输出: 2
解释:
| 编号 | 完整路径 |
|---|---|
| 1 | (0, 0) → (0, 1) → (1, 1) |
| 2 | (0, 0) → (1, 0) → (1, 1) |
示例 3:
输入: grid = [[0,1,1],[1,1,0]]
输出: 1
解释:
| 编号 | 完整路径 |
|---|---|
| 1 | (0, 0) → (0, 1) [M] → (1, 1) [M] → (1, 2) |
(0, 0) → (1, 0) [M] → (1, 1) [M] → (2, 1) 超出边界,因此是无效路径。
提示:
m == grid.lengthn == grid[i].length2 <= m, n <= 500grid[i][j]的值为0或1。grid[0][0] == grid[m - 1][n - 1] == 0
解题方法:动态规划
创建三个和原始矩阵等大的动态规划数组,$dp[i][j]$表示机器人到达 空格子 $(i, j)$的路径数,而$left[i][j]$和$up[i][j]$分别表示机器人从左边和从上方进入 镜子 $(i, j)$的路径数。
然后有以下状态转移规则:
数据存放位置:
- 如果当前位置是空格,则累加到$dp[i][j]$中;
- 如果当前位置是镜子,则从左边来的路线方案数累加到$left[i][j]$中,从上面来的路线方案数累加到$up[i][j]$中。
数据来源:
- 如果$i$非零,则机器人可从上方而来。上方为空白则添加方案$dp[i - 1][j]$到当前方案中;上方为镜子则添加方案$left[i - 1][j]$到当前方案中(从左上方向右折射再向下到当前位置);
- 如果$j$非零,则机器人可从左侧而来。左侧为空白则添加方案$dp[i][j - 1]$到当前方案中;左侧为镜子则添加方案$up[i][j - 1]$到当前方案中(从左上方向下折射再向右到当前位置)。
以上。
- 时间复杂度$O(mn)$
- 空间复杂度$O(mn)$。由于当前行只需要使用上一行的数据,所以也可以使用原地滚动数组使得空间复杂度降低到$O(line_len)$。
AC代码
C++
1 | |
End
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源
3665.统计镜子反射路径数目:三个动态规划数组
https://blog.letmefly.xyz/2026/11/01/LeetCode 3665.统计镜子反射路径数目/