2912:在网格上移动到目的地的方法数(★★)
目录
题目
给定两个整数 n
和 m
,它们表示一个 下标从 1 开始 的网格的大小。还给定一个整数 k
,以及两个 下标从 1 开始 的整数数组 source
和 dest
。这两个数组 source
和 dest
形如 [x, y]
,表示网格上的一个单元格。
你可以按照以下方式在网格上移动:
- 你可以从单元格
[x1, y1]
移动到[x2, y2]
,只要x1 == x2
或y1 == y2
。 - 注意,你 不能 移动到当前所在的单元格,即
x1 == x2
且y1 == y2
。
请返回你在网格上从 source
到 dest
移动 k
次一共可以有 多少种 方法。
由于答案可能非常大,因此请对 109 + 7
取模 后返回。
示例 1:
输入: n = 3, m = 2, k = 2, source = [1,1], dest = [2,2] 输出: 2 解释: 有两种可能的方式从 [1,1] 到达 [2,2]: - [1,1] -> [1,2] -> [2,2] - [1,1] -> [2,1] -> [2,2]
示例 2:
输入: n = 3, m = 4, k = 3, source = [1,2], dest = [2,3] 输出: 9 解释: 有 9 种可能的方式从 [1,2] 到达 [2,3]:: - [1,2] -> [1,1] -> [1,3] -> [2,3] - [1,2] -> [1,1] -> [2,1] -> [2,3] - [1,2] -> [1,3] -> [3,3] -> [2,3] - [1,2] -> [1,4] -> [1,3] -> [2,3] - [1,2] -> [1,4] -> [2,4] -> [2,3] - [1,2] -> [2,2] -> [2,1] -> [2,3] - [1,2] -> [2,2] -> [2,4] -> [2,3] - [1,2] -> [3,2] -> [2,2] -> [2,3] - [1,2] -> [3,2] -> [3,3] -> [2,3]
提示:
2 <= n, m <= 109
1 <= k <= 105
source.length == dest.length == 2
1 <= source[1], dest[1] <= n
1 <= source[2], dest[2] <= m
分析
#1 dp
- 移动中,实际上只关心跟目标单元格的横纵坐标是否相等
- 因此,维护 4 个状态表示与目标的横纵坐标相等情况,递推即可
|
|
1057 ms
#2 矩阵快速幂
每轮的递推系数相同,可以用矩阵快速幂优化
解答
|
|
437 ms