标签:状压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