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 ...
随机推荐
- python第三十二天-----算法
算法(Algorithm):一个计算过程,解决问题的方法时间复杂度:用来评估算法运行效率的一个东西ps:在日常使用中,请使用sort(),because no zuo no die! 1.冒泡排序:指 ...
- 将CDM中所有以Relatonship_开头的关系全部重命名,避免生成数据库因为重复关系名报错
Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl '当前model '获取当前活 ...
- leetcode398
public class Solution { int[] nums; Random rnd; public Solution(int[] nums) { this.nums = nums; this ...
- VI中的多行删除与复制(转)
VI中的多行删除与复制 法一: 单行删除,:(待删除行)d 多行删除 ,:,10d 法二: 光标所在行,dd 光标所在行以下的N行,Ndd 方法1: 光标放到第6行, 输入:2yy 光标放到第9行, ...
- JavaScript Array.map
Array.prototype.map() History Edit This article is in need of a technical review. Table of Contents ...
- 探索Web Office Apps服务
老样子,先放几个官链: WOA部署规划:http://technet.microsoft.com/zh-cn/library/jj219435(v=office.15).aspx 拓扑规划:http: ...
- css知多少(9)——float下篇(转)
css知多少(9)——float下篇 float内容比较多,咱们分上.下两篇来介绍,上篇已经写完,这是下篇.建议大家先把上篇看了,再来看下文,精彩内容不要掠过啊. 1. 清除float <上 ...
- SSM项目连接远程Linux服务器的mysql 启动tomcat卡在了 Initializing Spring root WebApplicationContext
网上查了原因, linux下mysql访问速度缓慢并且ssh连接缓慢的原因 解决办法: 1.linux ssh连接慢 最近发现ssh连接的时候却很慢,ping的速度非常好,让人误以为是ssh连接不上. ...
- 定时node-schedule 模块的使用
You can install using npm. npm install node-schedule var schedule = require('node-schedule'); var j ...
- eclipse中安装git插件
1 安装及配置git插件,问度娘即可 点击前往 2 eclipse 中怎么同步到 本地git仓库 和 码云远程仓库 点击前往