POJ 2411 Mondriaan's Dream -- 状压DP
题目: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的更多相关文章
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- Poj 2411 Mondriaan's Dream(压缩矩阵DP)
一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...
- POJ - 2411 Mondriaan's Dream(轮廓线dp)
Mondriaan's Dream Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nig ...
- poj 2411 Mondriaan's Dream(状态压缩dP)
题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...
- poj 2411 Mondriaan's Dream (轮廓线DP)
题意:有一个n*m的棋盘,要求用1*2的骨牌来覆盖满它,有多少种方案?(n<12,m<12) 思路: 由于n和m都比较小,可以用轮廓线,就是维护最后边所需要的几个状态,然后进行DP.这里需 ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
随机推荐
- .NET Core微服务之基于Consul实现服务治理(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...
- 个人完善的springboot拦截器
import lombok.extern.slf4j.Slf4j; import org.manage.management.permission.interceptor.LoginIntercept ...
- idea avtiviti 插件中文乱码
idea 安转activiti插件后,编辑流程图发现保存后中文乱码,并且idea的字符集(Settings—>Editor—>File Encodings)已经设置为UTF-8,流程图中中 ...
- 使用nginx搭建高可用,高并发的wcf集群
很多情况下基于wcf的复杂均衡都首选zookeeper,这样可以拥有更好的控制粒度,但zk对C# 不大友好,实现起来相对来说比较麻烦,实际情况下,如果 你的负载机制粒度很粗糙的话,优先使用nginx就 ...
- AI产品的商业模式
AI产品的商业模式 ------------------------------------------------------------------------------------------ ...
- WPF 水印TextBox WatermarkTextBox
//https://blog.csdn.net/puchitomato/article/details/12248691 转自以上链接,自己添加了Enter响应事件. public class ...
- .net接收post请求,并转为字符串
Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024]; StringBuilder reqXml ...
- 设计模式系列6:适配器模式(Adapter Pattern)
定义 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. --<设计模式>GoF UML类图 使用场景 在遗留代码复用,类 ...
- (详细)华为Mate7 MT7-TL00的usb调试模式在哪里开启的步骤
就在我们使用pc连接安卓手机的时候,如果手机没有开启usb调试模式,pc则不能够成功识别我们的手机,在一些情况下,我们使用的一些功能较好的工具好比之前我们使用的一个工具引号精灵,老版本就需要打开usb ...
- Linux使用wget、安装Python
原文:https://blog.csdn.net/ghost_chou/article/details/81905302 1.指定需要安装的目录或创建并访问到该选择的目录下. mkdir /data/ ...