zoukankan      html  css  js  c++  java
  • 【BZOJ 1087】【SCOI 2005】互不侵犯King

    http://www.lydsy.com/JudgeOnline/problem.php?id=1087
    很简单的状压,需要预处理,我两个状态可不可以挨着的预处理出错WA了好几次。
    这个位运算预处理好神奇啊

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 10;
    int in() {
    	int k = 0; char c = getchar();
    	for (; c < '0' || c > '9'; c = getchar());
    	for (; c >= '0' && c <= '9'; c = getchar())
    		k = k * 10 + c - 48;
    	return k;
    }
    
    bool can[1 << 9], c[1 << 9][1 << 9];
    ll f[N][N * N][1 << 9];
    int tot, n, K, num[1 << 9];
    bool flag;
    
    int main() {
    	n = in(); K = in();
    	
    	tot = (1 << n) - 1;
    	for (int i = 0; i <= tot; ++i)
    		if (can[i] = !(i & (i >> 1)))
    			for (int j = 0; j < n; ++j)
    				if ((1 << j) & i)
    					++num[i];
    	for (int i = 0; i < tot; ++i)
    		if (can[i])
    			for (int j = i + 1; j <= tot; ++j)
    				if (can[j])
    					c[i][j] = c[j][i] = !(i & j) && !(i & (j >> 1)) && !(j & (i >> 1));
    	c[0][0] = true;
    	
    	f[0][0][0] = 1;
    	for (int i = 1; i <= n; ++i)
    		for (int j = min(K, i * n); j >= 0; --j)
    			for (int k = 0; k <= tot; ++k)
    				if (can[k])
    					for (int l = 0; l <= tot; ++l)
    						if (can[l] && c[k][l] && num[l] <= j)
    							f[i][j][l] += f[i - 1][j - num[l]][k];
    	
    	ll ans = 0;
    	for(int i = 0; i <= tot; ++i)
    		ans += f[n][K][i];
    	printf("%lld
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    P3391 文艺平衡树
    隔离村庄(树形dp[01背包])
    cmd指令集
    vs的使用
    博客园第一天
    蓝桥杯 小生物的逃逸 模拟
    蓝桥杯 自行车停放 双向链表
    c++字符数组函数总结
    蓝桥杯 石子游戏 贪心
    蓝桥杯 最大获利 模拟
  • 原文地址:https://www.cnblogs.com/abclzr/p/5962731.html
Copyright © 2011-2022 走看看