添加链接描述
状态压缩dp
注意不能预处理ST数组,因为n不同,合法状态就不同,比如n等于5时,10000合法,n等于6时010000就不合法,10000和010000是一个数,但是数组里这个位置的值随n的不同而不同。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3e4+5,INF=0x3f,mod=1e9+7;
ll dp[15][maxn];
bool st[maxn];
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
for(int i=0;i< (1<<n);i++)
{
st[i]=true;
int cnt=0;
for(int j=0;j<n;j++)
{
if((i >> j)&1)
{
if(cnt&1)
{
st[i]=false;
break;
}
else cnt=0;
}
else cnt++;
}
if(cnt&1)
st[i]=false;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=m;i++)
for(int j=0;j< 1<<n ;j++)
for(int k=0;k< 1<<n ;k++)
if((j&k)==0&&st[j|k])
dp[i][j]+=dp[i-1][k];
cout<<dp[m][0]<<endl;
}
return 0;
}