链接:http://hihocoder.com/problemset/problem/1048
题解:https://blog.csdn.net/my_sunshine26/article/details/74612684
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int dp[1004][44],n,m;
bool check(int s1,int s2)
{
for(int i=0;i<m;i++)
if(!(s1>>i&1)&&!(s2>>i&1)) return 0;
int len=0;
for(int i=0;i<m;i++)
{
if(s2>>i&1&&s1>>i&1) len++;
if(!(s2>>(i+1)&1)||(s2>>(i+1)&1&&!(s1>>(i+1)&1)))
{
if(len%2) return 0;
len=0;
}
}
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<(1<<m);i++)
{
int len=0;
dp[1][i]=1;
for(int j=0;j<m;j++)
{
if(i>>j&1) len++;
if(!(i>>(j+1)&1))
{
if(len%2)
{
dp[1][i]=0;
break;
}
len=0;
}
}
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<(1<<m);j++)
{
for(int k=0;k<(1<<m);k++)
{
if(check(k,j))
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
}
}
}
printf("%d\n",dp[n][(1<<m)-1]);
return 0;
}