POJ 2411 Mondriaan's Dream

状压DP

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const int MAXN = 3000;
bool f[MAXN];
ll dp[14][MAXN], n, m;
void dfs(int k, int cur) {
	if(k == m){
		f[cur] = 1;
		return ;
	}
	dfs(k + 1, cur | (1<<k));
	if(k <= m - 2) dfs(k + 2, cur);
}
int main() {
	while(1) {
		cin >> n >> m;
		if(!n && !m) break;
		memset(f, 0, sizeof(f));
		dfs(0, 0);
		/*for(int i = 0; i <= 100; i++) {
			printf("%d %d\n",i, f[i]);
		}*/
		memset(dp, 0, sizeof(dp));
		dp[0][0] = 1;
		//for(int i = 0; i < (1 << m); i++) if(f[i]) dp[1][i] = 1;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < (1 << m); j++) {
				//if(f[j]) {
					for(int k = 0; k < (1 << m); k++) {
						if(f[k | j] && ((j & k) == 0)) {
							dp[i + 1][k] += dp[i][j]; 
						}
					}
				//}
				
			}
		}
		cout << dp[n][0] << endl;
	}
	return 0;
}
posted @ 2018-03-22 14:52  Mr_Wolfram  阅读(110)  评论(0编辑  收藏  举报