class Solution {
public:
int M;
int MOD=1e9+7;
int dp[1006][255];//3*3*3*3*3=243
bool check(int t)//同一列上的状态不可以相同
{
int last=-1;//对第一行,上一个状态为-1
for(int i=0;i<M;i++)
{
if(t%3==last) return false;
last=t%3;
t/=3;
}
return true;
}
bool check_n(int x,int y)//对于状态j和状态k的同一行上的状态不可以相同
{
for(int i=0;i<M;i++)
{
if(x%3==y%3) return false;
x/=3,y/=3;
}
return true;
}
int colorTheGrid(int m, int n) {
M=m;
int tol=1;
for(int i=0;i<m;i++) tol*=3;
//初始总状态,全打上1
for(int i=0;i<tol;i++)
if(check(i))
dp[1][i]=1;//这种初始状态合法
//枚举列
for(int i=2;i<=n;i++)
{
//枚举状态
for(int j=0;j<tol;j++)
{
if(check(j))//如果j状态合法
{
for(int k=0;k<tol;k++)
{
if(check(k))//如果k状态也合法
{
if(check_n(j,k))
dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD;
}
}
}
}
}
//对于最后一列的所有状态求和
int res=0;
for(int i=0;i<tol;i++)
res=(res+dp[n][i])%MOD;
return res;
}
};
状压DP