poj 2663 Tri Tiling 状压dp

来源:互联网 发布:干货 网络词语 英文 编辑:程序博客网 时间:2024/04/30 08:04

题意:

给3*N(N<=30)的矩形,问有多少种用1*2的小矩形铺满的方案。

分析:

同poj2411。

代码:

#include <iostream>using namespace std;__int64 ans[32][4];int n,m;__int64 dp[2][1<<4];__int64 solve(){int i,j,used;memset(dp,0,sizeof(dp));__int64 *crt=dp[0],*nxt=dp[1];crt[0]=1;for(i=n-1;i>=0;--i)for(j=m-1;j>=0;--j){for(used=0;used<(1<<m);++used){if(used>>j&1)nxt[used]=crt[used&(~(1<<j))];else{__int64 res=0;if(j+1<m&&!(used>>(j+1)&1))res+=crt[used|1<<(j+1)];if(i+1<n)res+=crt[used|(1<<j)];nxt[used]=res;}}swap(crt,nxt);}return crt[0];}int main(){while(scanf("%d",&n)==1){if(n==-1)break;m=3; memset(ans,-1,sizeof(ans));if(n<m)swap(n,m);if(ans[n][m]!=-1){printf("%I64d\n",ans[n][m]);continue;}if((n*m)%2==1)ans[n][m]=0;elseans[n][m]=solve();printf("%I64d\n",ans[n][m]);}return 0;} 


0 0