题目:Mondriaan's Dream

链接:http://poj.org/problem?id=2411

题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法。

思路:

  很久很久以前便做过的一道题目,状压DP,当时写得估计挺艰辛的,今天搜插头DP又搜到它,就先用状压DP写了下,顺利多了,没一会就出来了,可惜因为long long没有1A。

  思路挺简单,一行一行解决,每一列用1 表示对下一行有影响,用0 表示对下一行没有影响,所以一行最多2048 种可能,然后要筛选一下,因为有些本身就不合理,有些因为上一行的影响变得不合理,然后简单的三重循环搞定,发现以前的代码效率更高,懒得追究了,一起贴出来。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200
typedef long long LL;
int ans[N],ao;
bool check(int i,int m)
{
int co=,o=;
while(i)
{
o++;
if(i&)
{
if(co&) return false;
else co=;
}
else
{
co++;
}
i>>=;
}
if((m-o)&)
return false;
return true;
}
void find(int m)
{
for(int i=;i<(<<m);i++)
{
if(check(i,m)==)
{
ans[ao++]=i;
}
}
}
void dis(int i,int m)
{
int o=;
while(i)
{
printf("%d",i&);
o++;
i>>=;
}
for(int j=o;j<m;j++)
printf("");
printf("\n");
}
int pre[][],po;
LL dp[][];
bool check_2(int a,int b)
{
while(a)
{
if(a&)
{
if(b&);
else return false;
}
a>>=;
b>>=;
}
return true;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==) break;
ao=;
find(m);
memset(dp,,sizeof(dp));
po=;
for(int i=;i<ao;i++)
{
pre[][po++]=ans[i];
dp[][ans[i]]=;
}
int ko=;
bool v[]={};
for(int i=;i<n;i++)
{
memset(v,,sizeof(v));
for(int k=;k<po;k++)
{
if(v[pre[i-][k]]) continue;
v[pre[i-][k]]=;
for(int j=;j<ao;j++)
{
if(check_2(pre[i-][k],ans[j]))
{
//printf("pre %d ans %d\n",pre[i-1][k],ans[j]);
pre[i][ko++]=ans[j]^pre[i-][k];
dp[i][pre[i][ko-]]+=dp[i-][pre[i-][k]];
}
}
}
po=ko;
}
printf("%I64d\n",dp[n-][]);
}
return ;
}

AC代码--1

 #include<stdio.h>
#include<string.h>
#define LL long long
LL dp[][]; // 1:影响到下一行 0:不影响下一行 bool check(int m, int up, int x){
int flag=;
while(m--){
if(x&){
if(flag==) return false;
if(up&) return false;
}
else{
if(up&){
if(flag==) return false;
}
else flag^=;
}
x>>=;
up>>=;
}
if(flag==) return false;
return true;
} int main(){
int n, m;
while(scanf("%d%d", &n, &m)!=EOF){
if(n== && m==) break;
if(n*m%==){
printf("0\n");
continue;
}
memset(dp, , sizeof(dp));
int c = ( << m);
for(int i=; i<c; i++){
if(check(m, , i)){
dp[][i]=;
}
}
for(int i=; i<n; i++){
for(int j=; j<c; j++){
if(dp[i-][j]>){
for(int k=; k<c; k++){
if(check(m, j, k)){
dp[i][k]+=dp[i-][j];
}
}
}
}
}
printf("%I64d\n", dp[n-][]);
}
return ;
}

AC代码--2

POJ 2411 Mondriaan's Dream -- 状压DP的更多相关文章

  1. Poj 2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...

  2. POJ 2411 Mondriaan's Dream ——状压DP 插头DP

    [题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...

  3. POJ 2411 Mondriaan'sDream(状压DP)

    题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...

  4. [poj2411] Mondriaan's Dream (状压DP)

    状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...

  5. Poj 2411 Mondriaan's Dream(压缩矩阵DP)

    一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...

  6. POJ - 2411 Mondriaan's Dream(轮廓线dp)

    Mondriaan's Dream Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nig ...

  7. poj 2411 Mondriaan's Dream(状态压缩dP)

    题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...

  8. poj 2411 Mondriaan's Dream (轮廓线DP)

    题意:有一个n*m的棋盘,要求用1*2的骨牌来覆盖满它,有多少种方案?(n<12,m<12) 思路: 由于n和m都比较小,可以用轮廓线,就是维护最后边所需要的几个状态,然后进行DP.这里需 ...

  9. POJ 2411 Mondriaan's Dream 插头dp

    题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...

随机推荐

  1. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  2. 生产线平衡问题的+Leapms线性规划方法

    知识点 第一类生产线平衡问题,第二类生产线平衡问题 整数线性规划模型,+Leapms模型,直接求解,CPLEX求解 装配生产线平衡问题 (The Assembly Line Balancing Pro ...

  3. JDBC事务控制

    概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...

  4. electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)

    窗口间通信的问题 electron窗口通信比nwjs要麻烦的多 electron分主进程和渲染进程,渲染进程又分主窗口的渲染进程和子窗口的渲染进程 主窗口的渲染进程给子窗口的渲染进程发消息 subWi ...

  5. 【憩园】C#并发编程之异步编程(二)

    写在前面 前面一篇文章介绍了异步编程的基本内容,同时也简要说明了async和await的一些用法.本篇文章将对async和await这两个关键字进行深入探讨,研究其中的运行机制,实现编码效率与运行效率 ...

  6. Springboot 系列(十一)使用 Mybatis(自动生成插件) 访问数据库

    1. Springboot mybatis 介绍 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数获取 ...

  7. iview起步

    ivew是一套基于vue的高质量的ui组件库.使用它我们可以非常简单的得到非常美观的页面和非常棒的用户体验. 1. 获取源码 前往github下载源码,下载地址:https://github.com/ ...

  8. .Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置

    新建控制台应用(.Net Core)程序 添加json文件,命名为appsettings.json,设置文件属性 如果较新则复制.添加内容如下 { "MyWords" : &quo ...

  9. 学JAVA第十三天,方法、方法重载及构造函数

    今天终于不讲狗跳楼的问题了,今天讲了方法,方法重载及构造函数及构造函数重载的课程了. 这里说了有参好无参的,下面讲构造函数重载和方法重载. 其实,这上面写的这些方法,就相当一个模板.想要快速做出产品就 ...

  10. setTimeout与setInterval的区别浅析

    在网页制作动态效果时,一定会遇到某些需求,要求某段程序等待多时时间后再开始执行,就像在我们的生活中一样,待会儿再开始做一件事.在JavaScript中主要通过定时器实现此类需求,本文将对定时器做一个概 ...