https://leetcode-cn.com/problems/number-of-ways-to-paint-n-x-3-grid/
你有一个 n x 3的网格图 grid,你需要用 红,黄,绿三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。
给你网格图的行数 n。
请你返回给grid涂色的方案数。由于答案可能会非常大,请你返回答案对10^9 + 7取余的结果。
示例 1:
输入:n = 1
输出:12
解释:总共有 12 种可行的方法:
示例 2:
输入:n = 2
输出:54
示例 3:
输入:n = 3
输出:246
示例 4:
输入:n = 7
输出:106494
示例 5:
输入:n = 5000
输出:30228214
提示:
n == grid.length
grid[i].length == 3
1 <= n <= 5000
class Solution:
def numOfWays(self, n: int) -> int:
pattern = [
‘RGB‘, ‘RBG‘, ‘RGR‘,
‘RBR‘, ‘GBR‘, ‘GRB‘,
‘GRG‘, ‘GBG‘, ‘BRG‘,
‘BGR‘, ‘BRB‘, ‘BGB‘
]
# - construct transfer dict
# - to handle adjacent rows
next = {}
for p1 in pattern:
next[p1] = []
for p2 in pattern:
is_ok = True
for i in range(3):
if p1[i] == p2[i]:
is_ok = False
break
if is_ok:
next[p1].append(p2)
# - first row
prev = {p:1 for p in pattern}
# - from second row
for i in range(n-1):
# - d is temp dict for current row
curr = {p:0 for p in pattern}
# - accumulate
for k,v in prev.items():
for x in next[k]:
curr[x] += v
# - update previous row
prev = copy.copy(curr)
return sum(prev.values()) % (10**9 + 7)
[LeetCode in Python] 5383 (H) number of ways to paint n x 3 grid 给 N x 3 网格图涂色的方案数
原文:https://www.cnblogs.com/journeyonmyway/p/12684662.html