LeetCode周赛2020.4.12
手速场?只有最后一题值得看看
5383 给N*3网格涂色的方案数(hard)
典型的动态规划问题,N+1时的情况只取决于N时最后一层的涂色方案。
class Solution {
public:
int numOfWays(int n) {
int ps[12][3] = {{0,1,0},{1,0,1},{2,0,1},
{0,1,2},{1,0,2},{2,0,2},
{0,2,0},{1,2,0},{2,1,0},
{0,2,1},{1,2,1},{2,1,2}};
int statustrans[12][12];
memset(statustrans, 0, sizeof(statustrans));
for(int i=0;i<12;++i)
{
for(int j=0;j<12;++j)
{
if(i != j && ps[i][0]!=ps[j][0] && ps[i][1]!=ps[j][1] && ps[i][2]!=ps[j][2])
++statustrans[i][j];
}
}
long long dp[12];
for(int i=0;i<12;++i)
dp[i] = 1;
for(int i=1;i<n;++i)
{
long long pre[12];
memset(pre, 0, sizeof(pre));
for(int j=0;j<12;++j)
{
for(int k=0;k<12;++k)
{
pre[j] += dp[k]*statustrans[k][j];
pre[j] %= 1000000007;
}
}
memcpy(dp, pre, sizeof(dp));
}
long long cnt = 0;
for(int i=0;i<12;++i)
cnt += dp[i];
return cnt % 1000000007;
}
};