题意:
求h*w的矩形被1*2的小矩形覆盖的方案数。
分析:
状压dp入门,《挑战程序设计竞赛》上讲的很好,好几天才看懂。
代码:
#include <iostream> using namespace std; __int64 ans[16][16]; int n,m; __int64 dp[2][1<<16]; __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%d",&n,&m)==2){ if(n==0&&m==0) break; 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; else ans[n][m]=solve(); printf("%I64d\n",ans[n][m]); } return 0; }
poj 2411 Mondriaan's Dream 状压dp入门
原文地址:http://blog.csdn.net/sepnine/article/details/43853533