该题解采用了动态规划的思路,对不同的行数 m 有不同的处理方式。对于 m = 1 和 m = 2,题解使用了数学公式直接计算。对于 m >= 3 的情况,题解通过构建状态转移方程来描述每一列可能的涂色方式与前一列的关系,并通过迭代计算出所有列的涂色方案总数。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def colorTheGrid(self, m: int, n: int) -> int:
MOD = 10**9 + 7
if m == 1:
# 对于 m = 1 的情况,有三种涂色方法,并且每列都可以选择两种颜色
return 3 * pow(2, n - 1, MOD) % MOD
if m == 2:
# 对于 m = 2 的情况,首列有 6 种涂色方式,之后每列都有 3 种选择
return 6 * pow(3, n - 1, MOD) % MOD
if m == 3:
a = b = 6
# 使用两个变量 a 和 b 来追踪涂色方案的数量
for i in range(n - 1):
a, b = (a + b) << 1, (a << 1) + b * 3
return (a + b) % MOD
if m == 4:
a, b, c = 6, 12, 6
# 使用三个变量 a, b, c 来追踪涂色方案的数量
for i in range(n - 1):
a, b, c = (a << 1) + b + c, (a << 1) + (b << 2) + (c << 2), a + (b << 1) + c * 3
return (a + b + c) % MOD
a, b, c, d, e, f = 6, 12, 6, 6, 12, 6
# 使用六个变量来追踪更复杂情况 (m = 5) 的涂色方案数量
for i in range(n - 1):
a, b, c, d, e, f = (a << 1) + b + e, (a << 1) + b * 3 + (c << 1) + (d << 1) + (e << 1) + (f << 1), b + (c << 1) + (d << 1) + e + (f << 1), b + (c << 1) + d * 3 + (e << 1) + (f << 1), (a << 1) + (b << 1) + (c << 1) + (d << 2) + e * 3 + (f << 2), b + (c << 1) + (d << 1) + (e << 1) + (f << 1)
return (a + b + c + d + e + f) % MOD