蒙德里安的梦想
蒙德里安的梦想

思路:
例:

样例输入:
1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0
样例输出:
1
0
1
2
3
5
144
51205
代码模板:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 12;
bool st[1<<N];
long long dp[N][1<<N];
int n,m;
int main(){
while(cin>>n>>m,n||m){
memset(st,false,sizeof st);
//预处理
for(int i=0;i<1<<n;i++)
{
int cnt=0;
for(int j=0;j<n;j++) //
{
if((i>>j&1)==1)
{
if(cnt&1) st[i]=true;
cnt=0;
}
else cnt++;
}
if(cnt&1) st[i]=true;
}
//开始dp
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(!st[k|j]&&(j&k)==0)
dp[i][j]+=dp[i-1][k];
}
cout<<dp[m][0]<<endl;
}
return 0;
}

浙公网安备 33010602011771号