POJ-2411-Mondriaan's Dream
2013-09-25 23:44
169 查看
书上动态规划的状态压缩的练习题,是求w*h的长方形有放1*2和2*1的长方形,最多有多少种方法。
思路:
1、用状态压缩当前层的状态。
2、首先可以算出第一层的所有的合法状态,然后依次向后计算~
代码:
思路:
1、用状态压缩当前层的状态。
2、首先可以算出第一层的所有的合法状态,然后依次向后计算~
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=2050; int h,w,m,sz; long long dp[11][maxn],s[maxn]; void DFS(int index,int val,int cnt0) { if(index==w) { if(cnt0&1) return; s[sz++]=val; return; } if(cnt0&1) DFS(index+1,val,cnt0+1); else { DFS(index+1,val|(1<<index),cnt0); DFS(index+1,val,cnt0+1); } } void solve() { DFS(0,0,0); memset(dp,0,sizeof(dp)); for(int i=0;i<sz;i++) dp[0][s[i]]=1; for(int i=1;i<h;i++) for(int j=0;j<sz;j++) for(int k=0;k<=m;k++) { if(!dp[i-1][k]) continue; if((k&(~s[j]))!=0) continue; dp[i][s[j]-k]+=dp[i-1][k]; } printf("%I64d\n",dp[h-1][0]); } int main() { while(scanf("%d%d",&h,&w)&&(h+w)) { if((h*w)&1) { printf("0\n"); continue; } m=(1<<w)-1; sz=0; solve(); } return 0; }
相关文章推荐
- POJ 2411 Mondriaan's Dream(状态DP)
- POJ 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream 状态压缩(DP)
- POJ 2411
- [poj 2411]Mondriaan's Dream (状压dp)
- POJ 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream 状态压缩DP
- poj 2411 Mondriaan's Dream(状态压缩dP)
- poj 2411| 插头dp
- POJ 2411 状态压缩DP
- poj 2411 Mondriaan's Dream 轮廓线dp
- poj 2411 Mondriaan's Dream (状态dp)
- POJ 2411 状态压缩递,覆盖方案数
- poj 2411 Mondriaan's Dream(状态压缩dp)
- POJ 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
- Mondriaan's Dream POJ - 2411 (状压dp,轮廓线dp)
- POJ 2411 Mondriaan's Dream(状压DP)
- poj 2411 状态压缩dp
- POJ 2411 Mondriaan's Dream (状压DP)