POJ 2411 Mondriaan's Dream ——状压DP 插头DP
【题目分析】
用1*2的牌铺满n*m的格子。
刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况。
So Sad。
然后想到数据范围这么小,爆搜好了。于是把每一种状态对应的转移都搜了出来。
加了点优(gou)化(pi),然后poj上1244ms垫底。
大概的方法就是考虑每一层横着放的情况,剩下的必须竖起来的情况到下一层取反即可。
然后看了 《插头DP-从入门到跳楼》 这篇博客,怒抄插头DP
然后16ms了,自己慢慢YY了一下,写出了风(gou)流(pi)倜(bu)傥(tong)的代码
UPD:发现完全不需要轮廓线,直接把轮廓线断开一小段就可以转移了,更加坚定自己的算法渣了
【代码】
状压DP
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
ll dp[12][1<<12];
int pos[12],n,m,to[1<<12];
void print(int x){F(i,0,m-1)printf("%d",(x>>i)&1);}
void dfs(int x)
{
if (to[x]) return ;
to[x]=1;
F(i,0,m-2)
if ((!(x&pos[i]))&&(!(x&pos[i+1])))
dfs(x|pos[i]+pos[i+1]);
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
memset(dp,0,sizeof dp); int all=(1<<m)-1;
F(i,0,m) pos[i]=1<<i; dp[0][(1<<m)-1]=1;
F(i,0,n-1)
{
F(j,0,(1<<m)-1)
{
memset(to,0,sizeof to);
int aim=j^all; dfs(aim);
F(k,0,(1<<m)-1)
if (to[k]) dp[i+1][k]+=dp[i][j];
}
}
printf("%lld\n",dp[n][(1<<m)-1]);
}
}
插头DP
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; long long dp[2][1<<11]; int main()
{
int n,m;
while(scanf("%d%d",&n,&m),(n||m))
{
int total=1<<m;
int pre=0,now=1;
memset(dp[now],0,sizeof(dp[now]));
dp[now][0]=1; for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
swap(now,pre);
memset(dp[now],0,sizeof(dp[now])); for(int S=0;S<total;S++) if( dp[pre][S] )
{
dp[now][S^(1<<j)]+=dp[pre][S];
if( j && S&(1<<(j-1)) && !(S&(1<<j)) )
dp[now][S^(1<<(j-1))]+=dp[pre][S];
}
} printf("%lld\n",dp[now][0]);
}
}
自己写的代(gou)码(pi)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define F(i,j,k) for (int i=j;i<=k;++i)
ll dp[2][1<<12];
int n,m;
void print(int x)
{F(i,0,m)printf("%d",(x>>i)&1);}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
if (n<m) swap(n,m);
int now=1,pre=0;
memset(dp[now],0,sizeof dp[now]);
dp[now][0]=1;
F(i,0,n-1)
F(j,0,m-1)
{
now^=1;pre^=1;
memset(dp[now],0,sizeof dp[now]);
F(s,0,(1<<(m+1))-1) if (dp[pre][s])
{
if ((s&(1<<j))&&!(s&(1<<(j+1)))) dp[now][s^(1<<j)]+=dp[pre][s];
if (!(s&(1<<j))&&!(s&(1<<(j+1)))) dp[now][s^(1<<j)]+=dp[pre][s],dp[now][s^(1<<(j+1))]+=dp[pre][s];
if (!(s&(1<<j))&&(s&(1<<(j+1)))) dp[now][s^(1<<(j+1))]+=dp[pre][s];
}
if (j==m-1)
{
now^=1;pre^=1;
memset(dp[now],0,sizeof dp[now]);
F(s,0,(1<<m)-1) if (dp[pre][s]&&!(s&(1<<m)))
dp[now][(s<<1)&((1<<(m+1))-1)]+=dp[pre][s];
}
}
printf("%lld\n",dp[now][0]);
}
}
POJ 2411 Mondriaan's Dream ——状压DP 插头DP的更多相关文章
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- POJ 2411 Mondriaan's Dream/[二进制状压DP]
题目链接[http://poj.org/problem?id=2411] 题意:给出一个h*w的矩形1<=h,w<=11.用1*2和2*1的小矩形去填满这个h*w的矩形,问有多少种方法? ...
- POJ 2411 Mondriaan's Dream:网格密铺类 状压dp
题目链接:http://poj.org/problem?id=2411 题意: 给你一个n*m的网格 (1<=n,m<=11) ,往里面铺1*2或2*1的砖块,问你铺完这个网格有多少种不同 ...
- 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,骨牌覆盖,经典)
题意: 用一个2*1的骨牌来覆盖一个n*m的矩形,问有多少种方案?(1<=n,m<=11) 思路: 很经典的题目,如果n和m都是奇数,那么答案为0.同uva11270这道题. 只需要m个b ...
随机推荐
- Azure powershell 获取 vmSize 可用列表的命令
1.使用 Add-AzureAccount -Environment azurechinacloud 登录到订阅 2.选择默认的订阅 Select-AzureSubscription -Subscri ...
- 改变console.log的输出样式
console.log允许你通过css来格式化输出,格式如下: console.log(‘%c字符串%c字符串’, 样式1, [样式2]) 其中”%c”为模板字符串 例子: 1 console.log ...
- MAC 安装汇编编译工具 NASM
直接运行nasm报错: 开始安装: brew reinstall nasm
- CAD控件的超链接事件(网页版)
_DMxDrawXEvents::HyperlinkClick 有超连接的实体被点击了. 参数 说明 IDispatch* pEntity IMxDrawEntity,被点击的实体 DOUBLE dX ...
- vue 实现走马灯效果
Part.1 问题 在写一个H5页面时遇到一个需求,头部公告需要滚动变换,需要实现一个走马灯效果 Part.2 实现 我的做法:利用 定时器 + CSS3 变换公告数组的顺序 从而实现走马灯效果 ...
- Hopfield 网络(上)
讲的什么 这部分主要对 Hopfield 网络作一大概的介绍.写了其模型结构.能量函数和网络的动作方式.主要参考了网上搜到的一些相关 PPT. 概述 早在 1982 年,Hopfield 发表的文 ...
- java 正则表达式如何提取中文的问题
String regex="([\u4e00-\u9fa5]+)"; String str="132更新至456"; Matcher matcher = Pat ...
- hibernate的注解
1.many-to-one @ManyToOne @JoinColumn(name = "user_id") 2.many-to-many /** * 双向关联关系中,有且仅有一端 ...
- springmvc导出excel(POI)
/** * 导出excel表格 */ @RequestMapping(value = "/doExportData", method = {RequestMethod.POST, ...
- Bootstrap响应式布局(1)
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...