Node:状压DP-1(棋子问题)
来源:互联网 发布:想学淘宝美工设计 编辑:程序博客网 时间:2024/06/07 03:14
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>#include <stack>#include <queue>#define flush(arr,i) memset(arr,i,sizeof(arr))using namespace std;const int maxn = 310;int n, dp[10][maxn];/*在一个棋盘上放棋子,上下左右都没有棋子,一共有多少种方案状态压缩*//*补充把一个整数用二进制形式表示*/void display(int n){ if(!n) return; display(n >> 1); printf("%d", n & 1);}int main(){ //freopen("data.txt","r",stdin); //用1表示放棋子,0表示不妨,对于一行的状态,用一个数字的二进制位表示,0-2^n //1.判断一个数不存在相邻的两个1 --> ((n >> 1) & n ) != 0 //2.判断一个数(状态)与他前一个数(状态)是否冲突 -> j & k == 0; //3.转移方程:dp[i][j] -> 表示第i行状态为j时的方案数,我们求的是 dp[n][0....] // dp[i][j] = dp[i - 1][...k...] j & k == 0 while(scanf("%d", &n)) { int len = (1 << n); flush(dp, 0); dp[0][0] = 1; //枚举行,代表当前计算到了第i行,第0行用来初始化 for(int i = 1; i <= n; i++) { //表示第i行我尝试的状态 for(int j = 0; j < len; j++) { //第i行状态合法 if(((j >> 1) & j) == 0) { for(int k = 0; k < len; k++) //相邻两行之间状态不冲突,可以安放 if(!(j & k)) dp[i][j] += dp[i - 1][k]; } } } int ans = 0; for(int i = 0; i < len; i++) ans += dp[n][i]; printf("%d\n", ans); } return 0;}
0 0
- Node:状压DP-1(棋子问题)
- 棋子--状态压缩dp
- 51Nod-棋子游戏(博弈问题)
- coj 1504 放置棋子(诸侯安置)dp
- 【BZOJ3294】放棋子(CQOI2011)-DP+组合数学
- Node:区间DP-1
- 取棋子问题
- 百层楼扔棋子问题
- 棋子移动问题
- 取放棋子问题
- 算法:棋子移动问题
- 堆棋子问题
- 丢棋子问题
- 棋子染色问题(burnside引理或者polya定理)
- 【zzuliOJ】1922 - 棋子问题(bfs & 位运算)
- 抛玻璃棋子的问题
- poj- 1321-棋子问题-dfs
- Matlab取棋子博弈问题
- wpa_supplicant适配层 -- 详解
- overridePendingTransition的简介
- 在Linux中如何安装gcc
- 装箱问题
- CRM实施中应避免的5大问题
- Node:状压DP-1(棋子问题)
- 简单倒计时实现
- 面试官最爱提的问题TOP10来自:北京人才市场报
- 黑马程序员-----Java基础
- 二分查找
- JSON 数据结构介绍
- Android.mk 文件语法大全
- 蓝光基本术语
- linux下的小工具和小常识