标签:状压dp
3 2 3 7
1 5 2 11 3 781
一个地点为 1 代表是放着竖着向下的砖
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 #define fre(i,a,b) for(i = a; i <b; i++) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define bug pf("Hi\n") using namespace std; #define INF 0x3f3f3f3f #define N 22 int dp[N][16]; void dfs(int dep,int up,int down,int pos) //第 dep行状态为 up 更新下一行状态为 down 的情况 { if(pos>3) { dp[dep+1][down]+=dp[dep][up]; return ; } if(up&(1<<pos)) //上一行对下一行的pos位置填满 { dfs(dep,up,down,pos+1); return ; } dfs(dep,up,down|(1<<pos),pos+1); //竖着放在dep+1层的pos位置一个竖着向下的砖 if(pos<=2&&!(up&(1<<(pos+1)))) //横着放一块砖,占据两个位置 dfs(dep,up,down,pos+2); } int main() { int i,j,t,ca=0; dp[0][0]=1; fre(i,0,N) fre(j,0,16) if(dp[i][j]) dfs(i,j,0,0); sf(t); while(t--) { sf(i); pf("%d %d\n",++ca,dp[i][0]); } return 0; }
HDU 1992 Tiling a Grid With Dominoes (状压 dp)
标签:状压dp
原文地址:http://blog.csdn.net/u014737310/article/details/44171021