leetcode1141 N*3矩阵。阿里笔试no.1

你有一个 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-ways-to-paint-n-3-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


题解:
动态规划
每次对应上一行的所有三个数字排列有n中排列。
思路:确定某一层的所有排列数。每一层的总排列数由上层的排列所决定,上层排列分类不同,对应上层每种的排列得到的新排列数不同。
分为三类ABA类,ABC类,CBA类。其中,ABC类与CBA类互补。
ABA-> 3ABA + 2(ABC+CBA)---共两个
ABC+CBA-> 2ABA + 2(ABC+CBA)

设该层的ABA类个数为g[i],ABC+CBA类个数为h[i],则本层所有的排列数f[i]=g[i]+h[i]。
g[i+1]=3*g[i]+2*h[i]
h[i+1]=2*g[i]+2*h[i]
=>
f[i+1]= g[i+1]+h[i+1] = 5*g[i]+4*h[i] = 4*f[i]+g[i]

 

 

 

class Solution {
public:
    long long g[5005];
    long long f[5005];
    int mod = int(pow(10,9))+7;
    int numOfWays(int n) {
        g[1] = 6;
        f[1] = 12;
        for(int i=2; i<=n; i++){
            g[i] = ((f[i-1]*2)%mod + g[i-1])%mod;
            f[i] = ((4*f[i-1])%mod + g[i-1])%mod;
        }

        return f[n];
    }
};

 

posted @ 2021-03-11 16:05  会飞的雅蠛蝶  阅读(178)  评论(0编辑  收藏  举报