LeetCode|1411. 给 N x 3 网格图涂色的方案数

题目链接:1411. 给 N x 3 网格图涂色的方案数

你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。

给你网格图的行数 n
请你返回给 grid 涂色的方案数。由于答案可能会非常大,请你返回答案对 10^9 + 7 取余的结果。

示例 1:

输入:n = 1
输出:12
解释:总共有 12 种可行的方法:

img

示例 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

解题思路

题目分析

这里本来是要用动态规划的,而且比较麻烦,但是其实这题是可以找规律的,用数学方法解决会比较简单

观察LeetCode给的N=1示例,可以抽象区分为2种类型,ABA和ABC,也即涂两种颜色和三种颜色都涂。

image-20230310113610778

分情况讨论,可知,在下方增加1行时,有9种情况,又可以分为ABA和ABC两个大类

image-20230310113711503

本层的结果 \(=A B A\) 类的个数 \(m+A B C\) 类的个数 \(n\)
本层的每个 \(ABA\)\(=>\) 下层演化 3 个 \(A B A+2\)\(A B C\)
本层的每个 \(A B C\)\(=>\) 下层演化 2 个 \(A B A+2\)\(A B C\)
下层的结果 \(=A B A\) 类的个数 \(+A B C\) 类的个数 \(=(3 m+2 n)+(2 m+2 n)\)

Python代码实现

class Solution:
    def numOfWays(self, n: int) -> int:
        mod = 10**9 +7
        if n == 1:
            return 12 
        repeat = 6
        unrepeat = 6
        for i in range(n-1):
            new_repeat = repeat * 3 + unrepeat *2
            new_unrepeat = repeat * 2 + unrepeat *2
            repeat = new_repeat
            unrepeat = new_unrepeat
        return (repeat + unrepeat) % mod
posted @ 2023-03-10 11:40  Weltㅤ  阅读(47)  评论(0编辑  收藏  举报