题目: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. ColorUtil【Color工具类(color整型、rgb数组、16进制互相转换)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 主要用于color整型.rgb数组.16进制互相转换(-12590395 <--> #3FE2C5 <--> ...

  2. 论文学习-系统评估卷积神经网络各项超参数设计的影响-Systematic evaluation of CNN advances on the ImageNet

    博客:blog.shinelee.me | 博客园 | CSDN 写在前面 论文状态:Published in CVIU Volume 161 Issue C, August 2017 论文地址:ht ...

  3. Floyd算法java实现demo

    Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...

  4. 如何在linux下使用git管理上传代码&误删文件修复

    首先需要安装git,sudo apt-get install git,这时就可以下载代码了. 然后先在gituhub上新建一个仓库,然后先在本地建一个git目录,git init 然后再配置用户名和邮 ...

  5. 【Springboot】Springboot整合Thymeleaf模板引擎

    Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...

  6. nginx系列9:HTTP反向代理请求处理流程

    HTTP反向代理请求处理流程 如下图:

  7. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  8. 鼠标事件以及clientX、offsetX、screenX、pageX、x的区别

    鼠标事件 鼠标事件有下面这几种: 1. onclick 鼠标点击事件 box.onclick = function(e){ console.log(e) } 2. onmousedown 鼠标按下事件 ...

  9. vue element-ui 文件上传

    <el-upload class="upload-demo" action="" :before-remove="beforeRemove&qu ...

  10. 解决将Excel表导入到SQL Server数据库时出现Text was truncated or one or more characters had no match in the target code错误

    编写python爬虫程序可以在电商.旅游等网站上爬取相关评论数据,这些数据可以用于词云制作.感情词分析.提取关键词等,也可以将爬取下来的数据以自己的方式进行展示.评论数据爬取下来后,就要考虑怎样入库, ...