poj 2411 Mondriaan's Dream(状态压缩DP)
来源:互联网 发布:软件测试原则 编辑:程序博客网 时间:2024/05/16 18:10
看到discuss里面有人在晒各种20+行的代码,太犀利了!
开始一直想不到怎么编码,后来还是看了别人的思路,横着放记录为11,竖着放记录为竖着的01,即在该行为0,在下一行为1。这样的,第一行的初始状态中就不能出现连续的奇数个1,而且两行之间没有竖着的00。在两行合并的时候,同样不允许出现(j&k)中出现连续奇数个1(凡是在上一行是竖着放的,j&k后都为0),而两种状态加合的前提是(i|j==t-1),保证方格填满。
非常精巧的编码方式。
#include<stdio.h>#include<string.h>#define N 12typedef long long LL;int st[1<<N];LL dp[N][1<<N];int judge(int x){ int cnt=0; while(x) { if(x&1) cnt++; else { if(cnt&1) return 0; cnt=0; } x>>=1; } if(cnt&1) return 0; return 1;}void Init(){ int i,t; t=1<<11; for(i=0;i<t;i++) { if(judge(i)) st[i]=1; } return ;}int main(){ int n,m; Init(); while(scanf("%d%d",&n,&m),m+n) { if((m*n)%2!=0) { printf("0\n"); continue; } int i,j,k,t; memset(dp,0,sizeof(dp)); t=1<<m;j=0; for(i=0;i<t;i++) { if(st[i]) dp[1][i]=1; } for(i=2;i<=n;i++) { for(j=0;j<t;j++) for(k=0;k<t;k++) { if((j|k)!=t-1||st[(j&k)]!=1) continue; dp[i][j]+=dp[i-1][k]; } } printf("%I64d\n",dp[n][t-1]); } return 0;}
- POJ 2411 Mondriaan's Dream 状态压缩(DP)
- poj 2411 Mondriaan's Dream (状态压缩dp 入门)
- POJ 2411 Mondriaan's Dream (状态压缩DP)
- poj 2411 Mondriaan's Dream(状态压缩DP)
- POJ 2411 Mondriaan's Dream (dp + 状态压缩)
- poj 2411 Mondriaan's Dream (状态压缩dp)
- poj 2411 Mondriaan's Dream(状态压缩+dp)
- POJ - 2411 Mondriaan's Dream(状态压缩DP)
- poj 2411 Mondriaan's Dream(状态压缩DP)
- poj 2411 Mondriaan's Dream(状态压缩dp)
- poj 2411 Mondriaan's Dream (状态压缩dp)
- POJ 2411 Mondriaan's Dream 状态压缩DP
- POJ 2411 Mondriaan's Dream 状态压缩dp
- POJ 2411 Mondriaan's Dream(DP---状态压缩)
- poj 2411/hdu 1400 Mondriaan's Dream 状态压缩dp
- HDOJ 1400 & POJ 2411 - Mondriaan's Dream 状态压缩DP
- poj 2411 Mondriaan's Dream(状态压缩dp)
- [poj 2411]Mondriaan's Dream[状态压缩DP]
- Java 文件递归复制的失误与文件递归删除的补救
- 树得广度优先和深度优先遍历
- Win7系统终极密码设置防止别人动你的电脑
- 独立游戏新闻和评论网站
- Oracle之/* ASSIST */用法
- poj 2411 Mondriaan's Dream(状态压缩DP)
- 变更控制流程图(PMP第五版)
- windows编程模型
- J.U.C包介绍
- POJ 2245 Lotto (枚举)
- poj——1019(数学)
- 关于C/C++函数指针声明的理解
- Steve Yegge:Google面试秘籍
- build/core/base_rules.mk:195: already define