\(\color{#0066ff}{ 题目描述 }\)

给定一个m×n的矩形网格,用1×2多米诺骨牌完全平铺。 请注意,即使一个平铺的旋转与另一个平铺相匹配,它们仍算作不同的平铺。 下面显示了一个平铺示例。 输入格式

输入包括多组数据。每组数据占一行,包含两个整数m,n(n×m≤100)。输入结束标志为文件结束符(EOF)。 输出格式

对于每组数据输出一行,输出总数。

\(\color{#0066ff}{输入格式}\)

每组数据,两个整数 \(n,m\)

\(\color{#0066ff}{输出格式}\)

对于每组数据,输出答案。

\(\color{#0066ff}{输入样例}\)

2 10
4 10
8 8

\(\color{#0066ff}{输出样例}\)

89
18061
12988816

\(\color{#0066ff}{数据范围与提示}\)

\(n*m\leq 100\)

\(\color{#0066ff}{ 题解 }\)

一个状压DP,也可以写插头DP蒟蒻目前还不会

可以发现,行或列其中一个一定不超过10,所以将其状压

横着的块均为0, 竖着的块,上面为1, 下面为0

因此,如果上一行的某位置为1,那么本行该位置必须为0, 代表竖着块的下半部分

最后一行的状态必须为0

如何判断一个状态能否作为某状态的下一行

首先,对于横着的块,肯定是成对出现的,但是如果上一行是1,那么对应本行的0是属于竖着的块的,是独立的,不能与旁边的0拼成横着的

可以发现,将它们进行按位或,那么那些特殊的0就成了1, 这时候判断一下每次连续的0是否有偶数个就行了

对于上面是1下面必须是0的问题,可以按位与一下,为0就行了

为了保证时间复杂度,与处理出合法拼接状态,就能过了

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
using std::vector;
LL f[120][2050];
vector<int> v[2050][11];
int n, m;
bool cant(int zt, int lim) {
int tot = 0;
for(int i = 0; i < lim; i++) {
if(zt & (1 << i)) {
if(tot & 1) return true;
tot = 0;
}
else tot++;
}
if(tot & 1) return true;
return false;
}
LL dfs(int dep, int zt) {
if(dep == n) return !zt;
if(f[dep][zt]) return f[dep][zt];
for(int i = 0; i < (int)v[zt][m].size(); i++) {
f[dep][zt] += dfs(dep + 1, v[zt][m][i]);
}
return f[dep][zt];
}
bool ok(int zt) {
for(int i = 1; i < 9; i++)
if(!(zt & (1 << i)) && (zt & (1 << (i - 1))) && (zt & (1 << (i + 1)))) return false;
return true;
}
int main() {
for(int lim = 1; lim <= 10; lim++)
for(int i = 0; i < (1 << lim); i++)
for(int j = 0; j < (1 << lim); j++) {
if((i & j) || cant(i | j, lim)) continue;
v[i][lim].push_back(j);
}
while(~scanf("%d%d", &n, &m)) {
if(m > n) std::swap(n, m);
memset(f, 0, sizeof f);
if((n * m) & 1) puts("0");
else printf("%lld\n", m == 1? (n & 1? 0 : 1) : dfs(0, 0));
}
return 0;
}

UVA11270 Tiling Dominoes的更多相关文章

  1. UVA11270 Tiling Dominoes —— 插头DP

    题目链接:https://vjudge.net/problem/UVA-11270 题意: 用2*1的骨牌填满n*m大小的棋盘,问有多少种放置方式. 题解: 骨牌类的插头DP. 1.由于只需要记录轮廓 ...

  2. UVA11270 Tiling Dominoes(轮廓线动态规划)

    轮廓线动态规划是一种基于状态压缩解决和连通性相关的问题的动态规划方法 这道题是轮廓线动态规划的模板 讲解可以看lrj的蓝书 代码 #include <cstdio> #include &l ...

  3. uva 11270 - Tiling Dominoes(插头dp)

    题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...

  4. 【UVa】11270 Tiling Dominoes

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. <Sicily>Tiling a Grid With Dominoes

    一.题目描述 We wish to tile a grid 4 units high and N units long with rectangles (dominoes) 2 units by on ...

  6. 2016 Multi-University Training Contest 1 I. Solid Dominoes Tilings

    Solid Dominoes Tilings Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  7. POJ3420Quad Tiling(矩阵快速幂)

    Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3740 Accepted: 1684 Descripti ...

  8. Tri Tiling[HDU1143]

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. I - Tri Tiling

      Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status #in ...

随机推荐

  1. Sass、Less和Stylus

    1.背景介绍 1.Sass背景介绍 Sass是对CSS(层叠样式表)的语法的一种扩充,诞生于2007年,最早也是最成熟的一款CSS预处理器语言,它可以使用变量.常量.嵌套.混 入.函数等功能,可以更有 ...

  2. ECS Windows系统使用自带监视器查看IIS并发连接数

    问题现象 ECS Windows系统如何查看IIS并发连接数? 解决方案 1.运行-->输入“perfmon.msc” . 2.在“系统监视器”图表区域里点击右键,然后点“添加计数器”. 3.在 ...

  3. Oracle的REGEXP_REPLACE函数简单用法

    转载:http://blog.csdn.net/itmyhome1990/article/details/50380718

  4. XE Button Color

    XE Button Color,FMX Button 颜色 也可以放个rectangle+Glyph控件. http://blogs.embarcadero.com/sarinadupont/2014 ...

  5. C语言学习笔记--内存操作常见错误

    1. 野指针 (1)指针变量中的值是非法的内存地址,进而形成野指针 (2)野指针不是 NULL 指针,是指向不可用内存地址的指针 (3)NULL 指针并无危害,很好判断,也很好调试 (4)C 语言中无 ...

  6. import random随机生成验证码

    #!/usr/bin/env python import random temp = "" for i in range(6): num = random.randrange(0, ...

  7. js语法和数据类型

    基础知识(Basics) JavaScript 的很多语法借鉴自 Java,但也受 Awk,Perl 和 Python 影响. JavaScript 是大小写敏感的,使用 Unicode 字符集. 在 ...

  8. c#基础;初步学习循环语句

    循环语句就是 在满足循环条件的情况下会有顺序的执行循环体 循环语句:for   :    while    :     foreach:三种. 循环语句 必须具备四要素:初始条件.循环条件.循环体.状 ...

  9. 适合新手的Python爬虫小程序

    介绍:此程序是使用python做的一个爬虫小程序  爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...

  10. Overloaded的方法是否可以改变返回值的类型

    摘要: 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同) Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载 ...