题目链接:HDU 1143 Tri Tiling
题意:3*N的矩形,用2*1的小矩形铺满有多少种情况。
思路:每个小矩形可以横着放或是竖着放,发现3数据比较小可能状压做,小矩形竖着放为1,横着放为0(所以0是成对出现的),注意我们摆放的规则是摆到那一行应该把那一行铺满。
AC代码:
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int dp[35][(1<<3)+10];
int ok(int now,int pre) {
if(pre == 1 && (now == 0 || now == 6))
return true;
if(pre == 4 && (now == 0 || now == 3))
return true;
if(pre == 7 && now == 0)
return true;
if(pre == 3 && now == 4)
return true;
if(pre == 6 && now == 1)
return true;
if(pre == 0 && (now == 1 || now == 4 || now == 7))
return true;
return false;
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF) {
if(n==-1) break;
if(n==0){
printf("1\n");
continue;
}
memset(dp,0,sizeof dp);
for(i=0;i<n;i++) {
if(i==0) {
dp[i][1]=1,dp[i][4]=1,dp[i][7]=1;
}
else {
for(j=0;j<(1<<3);j++) {
if(!dp[i-1][j]) continue;
for(k=0;k<(1<<3);k++) {
if(ok(k,j)) dp[i][k]+=dp[i-1][j];
}
}
}
}
printf("%d\n",dp[n-1][0]);
}
return 0;
}