蒙德里安的梦想

蒙德里安的梦想

![在这里插入图片描述]( https://img-blog.csdnimg.cn/b8b460bae10142be84b2d57b03c964ae.png?x-oss-process=image/watermark ,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUGFuc2XCtw==,size_20,color_FFFFFF,t_70,g_se,x_16)

思路:
例:
![在这里插入图片描述]( https://img-blog.csdnimg.cn/73676931fb1d4111b263155b62968e95.png?x-oss-process=image/watermark ,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUGFuc2XCtw==,size_20,color_FFFFFF,t_70,g_se,x_16)
样例输入:

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;
} 

 

posted @ 2022-03-22 14:08  panse·  阅读(46)  评论(0)    收藏  举报