poj2411 Mondriaan's Dream[简单状压dp]
$11*11$格子板上铺$1*2$地砖方案。以前做过?权当复习算了,毕竟以前学都是浅尝辄止的。。常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续偶数个的1,预处理一下即可。注意数据及时reset。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=;
ll f[N][<<N-];
int n,m,ful,g[<<N-]; int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
for(register int i=;i<(<<);++i){
int cnt=;
for(register int j=;j<;++j){
if(!((<<j)&i)){if(cnt&)break;cnt=;}
else ++cnt;
}
if(!(cnt&))g[i]=;
}
while(read(n),read(m),n){
if((n*m)&){printf("0\n");continue;}
f[][ful]=;ful=(<<m)-;f[][ful]=;
for(register int i=;i<=n;++i){
for(register int j=;j<=ful;++j){
f[i][j]=;
for(register int k=;k<=ful;++k)if(((j|k)==ful)&&(g[j&k])){
f[i][j]+=f[i-][k];
}
}
}
printf("%lld\n",f[n][ful]);
}
return ;
}
UPD:以前个人理解这个$0/1$状态设计有问题。应当是$f[i][S]$表示的是当前推导了第$i$行,状态$S$,对应二进制位$1$的表示这一格填了,$0$表示还没填,有$0$的这种情况下是留作下一行使用的(也就是可以由现在没填的情况推向下一行同一列填好的情况),说“表示放下竖着摆的砖的上半部分”的说法是不确切的。这样,用上述正确的状态定义就可以方便解决绝大多数铺砖类题目。再比如:
如果有的格子不准铺,有多少种铺法?最多铺多少个?用上面的定义,可以在当前状态$S$下使用DFS推导出下一行的所有合法方案并更新,不能铺的地方也用$1$来表示。当然,也可以使用轮廓线DP来推,但是好像会被dfs吊打。。但是最好不要用暴力枚举来推,有大量冗余状态。
详细可以见这道题目题解。poj1038 Bugs Integrated, Inc.[状压DP]
poj2411 Mondriaan's Dream[简单状压dp]的更多相关文章
- [Poj2411]Mondriaan's Dream(状压dp)(插头dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18096 Accepted: 103 ...
- POJ2411 Mondriaan's Dream 【状压dp】
没错,这道题又是我从LZL里的博客里剽过来的,他的题真不错,真香. 题目链接:http://poj.org/problem?id=2411 题目大意:给一个n * m的矩形, 要求用 1 * 2的小方 ...
- poj2411 Mondriaan's Dream【状压DP】
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20822 Accepted: 117 ...
- ☆ [POJ2411] Mondriaan's Dream 「状压DP」
传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. ...
- poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)
这道题的解析这个博客写得很好 https://blog.csdn.net/shiwei408/article/details/8821853 大致意思就是我们可以只处理两行之间的关系,然后通过这两个关 ...
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925
题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可 ...
- [poj 2411]Mondriaan's Dream (状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...
- POJ 2411 Mondriaan's Dream/[二进制状压DP]
题目链接[http://poj.org/problem?id=2411] 题意:给出一个h*w的矩形1<=h,w<=11.用1*2和2*1的小矩形去填满这个h*w的矩形,问有多少种方法? ...
随机推荐
- 常用模块---sys&logging&序列化模块(json&pickle)
sys 模块 sys.argv 命令行参数List,第一个元素是程序本身路径,通常用来避免io 阻塞 print('欢迎进入') info=sys.argv ': print('login succe ...
- POI 百万数据导出
poi 导出主类 package test; import java.io.File; import java.io.FileOutputStream; import java.lang.reflec ...
- java 程序的使用
Java程序可以在任何安装有Java平台的系统上运行,运行的时候语法如下: java -jar <program.jar> -jar这个参数是必须有的,后面跟你的java程序,例如我们 ...
- Kubernetes List-Watch
list-watch,作为k8s系统中统一的异步消息传递方式,对系统的性能.数据一致性起到关键性的作用. list-watch操作需要做这么几件事: 由组件向apiserver而不是etcd发起wat ...
- URI Is Not Registered
使用IntelliJ Maven生成archetype时候,偶然会出现xml文件的头定义提示错误 URI is not registered 例如: 解决方法: 鼠标点击红色字,然后Intellij出 ...
- [转载]allowTransparency属性
原文地址:allowTransparency属性作者:惊寒唱晚 IE5.5开始支持浮动框架的内容透明.如果想要为浮动框架定义透明内容,则必须满足下列条件. 1.与 iframe 元素一起使用的 all ...
- 利用Phoenix为HBase创建二级索引
为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...
- 如何编写 Makefile
1. 目标 依赖 命令 make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的 ...
- DB处理大量数据处理日志报错问题
因为当插入.更新或删除大批量数据的时候,有时候会出现事务日志满的问题,所以解决步骤 1.连接到当前数据库 db2 connect to uppdb 2.查看数据库配置文件 db2 get db cf ...
- shitf+tab
在eclipse中,shitf+tab可以使代码向左移动.