状态压缩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;
	}
}

  

原文地址:https://www.cnblogs.com/myhnb/p/11253861.html