UVA11270 Tiling Dominoes
\(\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的更多相关文章
- UVA11270 Tiling Dominoes —— 插头DP
题目链接:https://vjudge.net/problem/UVA-11270 题意: 用2*1的骨牌填满n*m大小的棋盘,问有多少种放置方式. 题解: 骨牌类的插头DP. 1.由于只需要记录轮廓 ...
- UVA11270 Tiling Dominoes(轮廓线动态规划)
轮廓线动态规划是一种基于状态压缩解决和连通性相关的问题的动态规划方法 这道题是轮廓线动态规划的模板 讲解可以看lrj的蓝书 代码 #include <cstdio> #include &l ...
- uva 11270 - Tiling Dominoes(插头dp)
题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...
- 【UVa】11270 Tiling Dominoes
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- <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 ...
- 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 ...
- POJ3420Quad Tiling(矩阵快速幂)
Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3740 Accepted: 1684 Descripti ...
- Tri Tiling[HDU1143]
Tri Tiling Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- I - Tri Tiling
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status #in ...
随机推荐
- 深入VR之前 你应该知道VR头显透镜原理
转自:http://www.gamelook.com.cn/2016/03/246817 要理解虚拟现实头显透镜的工作原理,首先要搞懂眼睛是如何看到事物的. 眼睛瞳孔后有晶状体,也就是眼珠子.眼睛的背 ...
- JAVA基础知识(13)-----Lock接口
Lock接口:多线程在JDK1.5版本升级时,推出一个接口Lock接口.解决线程安全问题使用同步的形式,(同步代码块,要么同步函数)其实最终使用的都是锁机制. 到了后期版本,直接将锁封装成了对象.线程 ...
- 数据校验(3)--demo2---bai
input_user.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...
- 2015.3.31不使用debug/X86文件夹方式解决64/32位问题
传统方法:在解决方案-配置管理器-新建X86平台可以解决32位兼容问题,但是Debug目录下会多出X86文件夹.不方便 另一种方法:在项目名称-属性-生成-目标平台-x86也能解决问题,而且不出现X8 ...
- 问题:C#控制台 停留;结果:c#控制台如何延时显示
Thread.Sleep(毫秒数);//比如Thread.Sleep(2000)即为延时2秒需using System.Threading; 随笔5 - C#控制台窗口的显示与隐藏 1. 定义一个Co ...
- Eclipse: “The import java.io cannot be resolved”
检查一下选项: 重点看jdk的绑定 43down voteaccepted Check your Eclipse preferences: Java -> Installed JREs. The ...
- #关于 OneVsRestClassifier(LogisticRegression(太慢了,要用超过的机器)
#关于 OneVsRestClassifier #注意以下代码中,有三个类 from sklearn import datasets X, y = datasets.make_classificati ...
- 反向索引(Inverted Index)
转自:http://zhangyu8374.iteye.com/blog/86307 反向索引是一种索引结构,它存储了单词与单词自身在一个或多个文档中所在位置之间的映射.反向索引通常利用关联数组实现. ...
- DHCP工作工程
1.客户端请求IP 客户端发一个DHCP DISCOVEY(包含主机名.mac地址)广播包 2.服务端响应请求 DHCP服务器收到请求后,查看自己的地址池是否有合法的地址.如果有,广播一个DHCP o ...
- setAttribute这个方法
setAttribute这个方法,在JSP内置对象session和request都有这个方法,这个方法作用就是保存数据,然后还可以用getAttribute方法来取出.比如现在又个User对象,Use ...