题意:

给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它

问你能有多少种填充方式

题解:

如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成影响,所以我们在 这个位置用0来表示,那么下一层的这一列就必须使用1.可以说竖着放是用

0

1 这样来表示

例如上一层的状态是(二进制表示为):11001111 那么我们先对它取反00110000,为什么要这样呢,因为上一层0的位置必须下一层要是1,然后我们在对状态00110000中 的0进行判断,因为这个0表示上一层不对这个位置造成影响,所以我们在这个位置可以接着横着放,也可以竖着放

第一层初始化的时候,状态00110001111,只要状态中连续1的数量是一个偶数这个状态就可以用来初始化第一层dp

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define mem__(a) memset(a,-1,sizeof(a))
typedef long long ll;
const int maxn=15;
const int N=(1<<11);
const int INF=0x3f3f3f3f;
const double blo=1.0/3.0;
const double eps=1e-8;
ll state[N],dp[maxn][N],tem,n,m;
//这个函数就是暴力枚举适合上一层状态的状态
/*
如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成影响,所以我们在
这个位置用0来表示,那么下一层的这一列就必须使用1.可以说竖着放是用
0
1 这样来表示 例如上一层的状态是(二进制表示为):11001111
那么我们先对它取反00110000,为什么要这样呢,因为上一层0的位置必须下一层要是1,然后我们在对状态00110000中
的0进行判断,因为这个0表示上一层不对这个位置造成影响,所以我们在这个位置可以接着横着放,也可以竖着放 */
void dfs(ll i,ll p,ll k)
{
if(k>=m) //这里要注意,宽为m的矩形,我们只需要使用[0,m-1]这些下标表示,所以就不能出现p&(1<<m)这种
{
dp[i][p]+=tem;
return;
}
dfs(i,p,k+1);
if(k<=m-2 && !(p&1<<k) && !(p&1<<k+1)) //这里要求的m-2是因为下标范围在[0,m-1],你要是想横着放置一个1*2矩形
//你就需要赵勇两个位置,这两个位置最大是m-1,m-2
dfs(i,p|1<<k|1<<k+1,k+2); //为什么要k+2,因为你把这两个位置变成1之后,要让下标向后移动两位
}
int main()
{
while(~scanf("%lld%lld",&n,&m))
{
ll num=0;
if(n==0 && m==0) break;
mem(dp);
for(ll i=0; i<(1<<m); ++i)
{
ll k=i,len=0,flag=0;
while(k)
{
if(k&1)
{
len++;
}
else
{
if(len!=0 && len%2)
{
flag=1;
break;
}
len=0;
}
k>>=1;
}
if(len!=0 && len%2)
{
flag=1;
}
if(flag==0)
{
state[num++]=i;
}
}
for(ll i=0; i<num; ++i)
{
dp[1][state[i]]=1;
} tem=1;
//dfs(1,0,0); //或者你可以不要上面的直接运行这一行代码也可以完成初始化
//我上面的代码就是先找了一些初始化的满足题意的状态
for(ll i = 2; i<=n; i++)
{
for(ll j = 0; j<1<<m; j++)
{
if(dp[i-1][j])
tem = dp[i-1][j];
else
continue;
dfs(i,~j&((1<<m)-1),0);
}
}
printf("%lld\n",dp[n][(1<<m)-1]);
}
return 0;
}

【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态的更多相关文章

  1. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  2. bjtu 1846. Infinity的装备[状压dp+dfs/bfs]

    https://citel.bjtu.edu.cn/acm/oj/problem/1846 1846. Infinity的装备 时间限制 1000 ms 内存限制 64 MB 题目描述 “测试服终于下 ...

  3. POJ 2411 Mondriaan's Dream -- 状压DP

    题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...

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

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

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

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

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

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

  7. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  8. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

  9. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

随机推荐

  1. 计算机考研复试 A+B

    题目描述 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B ...

  2. 无限重置IDE过期时间插件 亲测可以使用

    相信破解过IDEA的小伙伴,都知道jetbrains-agent这个工具,没错,就是那个直接拖入到开发工具界面,一键搞定,so easy的破解工具!这个工具目前已经停止更新了,尽管还有很多小伙伴在使用 ...

  3. ctfhub技能树—信息泄露—备份文件下载—.DS_Store

    打开靶机 查看页面信息 使用dirsearch进行扫描 访问该网页,下载文件 使用Linux系统打开文件 发现一个特殊文件,使用浏览器打开 拿到flag 二.使用Python-dsstore工具查看该 ...

  4. px转rem的填坑之路

    这是要为一个vue项目做自适应,设计稿是1920*1080的,要适应各种手机.ipad.3840*2160的超大屏,所以就选择了rem,包用的是 postcss-pxtorem 在适配的时候遇到了很多 ...

  5. 以我的亲身经历,聊聊学python的流程,同时推荐学python的书

    因为干活要用到,所以我大概于19年5月开始学python,大概学了1个月后,我就能干公司的活了,而且这python项目还包含了机器学习等要素,大概3个月后,我还承担了项目里开发机器学习数据分析的任务. ...

  6. HTML基础复习2

    6.表格 6.1建立表格: 表格由<table></table>标签来定义 每行由<tr></tr>来定义,每行被分割为若干单元格,由<td> ...

  7. 牛逼!MySQL 8.0 中的索引可以隐藏了…

    MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...

  8. [微信小程序]字体文件,字体图标(.ttf,.woff,woff2)等无法显示问题

    一. 背景 项目引用了第三方UI框架Vant-weapp,但是前几天Vant的cdn被运营商封禁,导致van-icon无法使用. 有赞官方在Github上给出了在小程序app.wxss上添加以下代码的 ...

  9. jmeter---线程组执行顺序记录

    一.默认未勾选测试计划中独立运行每个线程组时,线程组并行执行,如下,设置三个请求,每个线程组设置5秒启动5个线程. 未勾选独立运行 运行结果如下,三个线程并行执行 勾选后,一个线程组执行完后才执行下一 ...

  10. 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE

    阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...