poj 2663 Tri Tiling

本文探讨了一种利用状态压缩DP方法解决数学推规律问题的技巧,特别是针对POJ在线编程平台上的问题2663。通过枚举状态并计算转移,实现了高效的求解过程。特别注意处理大矩形长度为0的情况,该情况下的铺方格方式只有1种。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值