状态压缩DP:蒙德里安的梦想

代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long f[12][1<<11];
bool yy[1<<11];
int main(){
while(cin>>n>>m&&n){
for(int i=0;i<1<<m;i++){
bool cnt=0,flag=0;
for(int j=0;j<m;j++)
if(i>>j&1)flag|=cnt,cnt=0;//|意为“有1就为1”来自NineDream同学
else cnt^=1;
yy[i]=flag|cnt?0:1;//三目运算符,不懂可以看看——》https://www.cnblogs.com/myhnb/p/11245031.html
}
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<1<<m;j++){
f[i][j]=0;
for(int k=0;k<1<<m;k++)
if((j&k)==0&&yy[j|k])
f[i][j]+=f[i-1][k];
}
cout<<f[n][0]<<endl;
}
}

浙公网安备 33010602011771号