#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
/*
最烦的就是这种数学推规律的题,递推公式推导对我来说相当困难,所以一开始我就考虑了用状态压缩DP来做,呵呵,不能离了老本行啊!
其实考虑一下,这道题每一行的状态就3个即1,4,7 所以状态压缩DP效率是很高的,在不优化的情况下时间也只有o(30*8*8)
完全可以秒过.
但这个题目的恶心之处在于当大矩形长度为0时铺方格的方式是1种,在这个地方连载了三次。
哎……题目链接:http://poj.org/problem?id=2663
*/
int dp[31][10];
bool ok(int x){
if(x==1 || x==4 || x==7)return true;
else return false;
}
void init(){
int r,i,j;
memset(dp,0,sizeof(dp));
dp[0][1]=dp[0][4]=dp[0][7]=1;
for(r=1;r<31;r++){
for(i=0;i<8;i++){//枚举第r行状态
for(j=0;j<8;j++){//枚举第r-1行状态
if(i&j)continue;
if(ok(i|j))dp[r][i]+=dp[r-1][j];
}
}
}
}
int main(){
int row;
init();
while(scanf("%d",&row) && row!=-1){
if(row==0){
printf("%d\n",1);
continue;
}
if(row&1){
printf("0\n");
continue;
}
printf("%d\n",dp[row-1][0]);
}
return 0;
}
状态压缩DP poj 2663 骨牌铺方格
最新推荐文章于 2022-03-02 10:02:44 发布