题目链接:http://poj.org/problem?id=2663
#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; }poj 2663 Tri Tiling
最新推荐文章于 2021-08-04 15:15:41 发布