poj 3797(状态压缩dp)

题意:4*n的木板,用1*2方块去贴,问一共有多少种方案。


解题思路:这道题是简单的状态压缩,和之前的铺方块是一样的思路,横着的为全1,如果有空格等着下一行去铺就置0,那么下一行的这个位置肯定为1,因为要竖着插把上一行的填满。剩下的就是简单的状态转移了。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 1005;
const int bit = 1<<4;
int n,dp[maxn][bit];

bool check(int s1,int s2)
{
	if((s1 | s2) != bit-1) return false;
	int cnt = 0;
	for(int i = 0; i < 4; i++)
	{
		if((s1 & (1<<i)) && (s2 & (1<<i))) cnt++;
		else
		{
			if(cnt % 2 == 1) return false;
			cnt = 0;
		}
	}
	if(cnt % 2 == 1) return false;
	return true;
}

int main()
{
	int t,cas = 1;
	scanf("%d",&t);
	while(t--)
	{
		memset(dp,0,sizeof(dp));
		scanf("%d",&n);
		for(int i = 0; i < bit; i++)
			if(check(i,bit-1) == true)
				dp[1][i] = 1;
		for(int i = 2; i <= n; i++)
			for(int j = 0; j < bit; j++)  //第i行状态
				for(int k = 0; k < bit; k++) //第i-1行状态
					if(check(j,k) == true)
						dp[i][j] += dp[i-1][k];
		printf("%d %d\n",cas++,dp[n][bit-1]);
	}
	return 0;
}


你可能感兴趣的:(dp)