题目: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. 【Android Studio安装部署系列】四十二、Android Studio使用Eclipse中的keystore为App签名

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 从eclipse迁移到AndroidStudio,要用原Eclipse的签名文件,这样才能保证转到AndroidStudio后更新的 ...

  2. java~api返回值的标准化

    api返回值的标准化 例如 {"status":200,"message":"操作成功","data":"{\ ...

  3. 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...

  4. Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则

    通过上一篇<使用Sentinel实现接口限流>的介绍,相信大家对Sentinel已经有了初步的认识.在Spring Cloud Alibaba的整合封装之下,接口限流这件事情可以非常轻易的 ...

  5. cordova+vue打包webapp

    使用cordova+vue打包webapp,可以快速给网页套上一个android和ios壳子,完成一个app的开发. 1. 环境准备. (1)node.js  下载地址: https://nodejs ...

  6. composer windows下安装

    composer windows安装  因要使用PhpSpreadsheet处理excel表格 选择composer安装 1. 下载Composer-Setup.exe 2.点击直接运行---选择ph ...

  7. Django 传递额外参数及 URL别名

    传递额外参数到视图函数中 在 urls.py 文件中添加下面内容 from django.conf.urls import url urlpatterns = [ url(r'index', view ...

  8. Jetty 开发指南:嵌入式开发示例

    Jetty具有嵌入各种应用程序的丰富历史. 在本节中,我们将向您介绍我们的git存储库中的embedded-jetty-examples项目下的一些简单示例. 重要:生成此文档时,将直接从我们的git ...

  9. 【已采纳】charles工具使用心得

    1.下载charles 可以去charles官网下载,下载地址:http://www.charlesproxy.com/download/    根据自己的操作系统下载对应的版本,然后进行安装,然后打 ...

  10. 如何从GitHub下载csv文件

    当打开存.csv文件的页面时,不用直接点击页面的Download,这样会使csv文件直接用浏览器打开. 要点击Raw按钮,鼠标右键,文件另存为,可以直接把csv文件下载到本地.