• 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
    ",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;
    }
    
  • 相关阅读:
    HDU 1002 A + B Problem II
    leetcode 42.接雨水
    无向图 及其术语
    C++优先队列详解
    C++优先队列详解
    最短路
    最短路
    CF DP练习题
    CF DP练习题
    干货
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8623837.html
Copyright © 2020-2023  润新知