UVA11270 Tiling Dominoes —— 插头DP
题目链接:https://vjudge.net/problem/UVA-11270
题意:
用2*1的骨牌填满n*m大小的棋盘,问有多少种放置方式。
题解:
骨牌类的插头DP。
1.由于只需要记录轮廓线上m个位置的放置情况(0或1),且m<=10,2^10 = 1024,故可以用二进制对轮廓线的信息进行压缩。
2.二进制中,第0为代表着当前轮廓线位于第0列的位置的放置情况,以此类推。
3.具体情况分析,设当前格子为a[i][j]:
1) 不放置:前提条件为上面的位置a[i-1][j]已经放置了骨牌。原因:如果上面的位置为空,且这次又不放,那么往后就没有机会填补这个空缺了。
2) 往上放:前提条件为上面的位置a[i-1][j]没有放置骨牌。原因显而易见。
3) 往左放:前提条件为上面的位置a[i-1][j]放置了骨牌,且左边的位置a[i][j-1]没有放置骨牌。原因:情况1)和情况2)的综合。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = ; int n, m, cur;
LL dp[][<<MAXN]; int main()
{
while(scanf("%d%d", &n,&m)!=EOF)
{
if(n<m) swap(n, m);
memset(dp, , sizeof(dp)); cur = ;
dp[][(<<m)-] = ; //初始状态,第一个格子的轮廓线上都有插头,所以就防止了往外放
for(int i = ; i<n; i++)
for(int j = ; j<m; j++)
{
cur ^= ;
memset(dp[cur], , sizeof(dp[cur]));
for(int s = ; s<(<<m); s++) //由于有m个插头,而插头的编号从0开始,故最大状态为(1<<m)-1。
{
//枚举的是上一个格子的所有状态,即当前格子的轮廓线
int up = <<j; //位于第j列的插头,即上插头
int left = <<(j-); //位于第j-1列的插头, 即左插头
bool hav_up = s&up;
bool hav_left = s&left;
if( hav_up ) //不放置,前提是上插头存在
dp[cur][s^up] += dp[cur^][s]; if( i!= && !hav_up) //往上边放,前提是上插头不存在
dp[cur][s^up] += dp[cur^][s]; if( j!= && hav_up && !hav_left ) //往左边放,前提是上插头存在且左插头不存在
dp[cur][s^left] += dp[cur^][s];
}
} printf("%lld\n", dp[cur][(<<m)-]);
}
}
UVA11270 Tiling Dominoes —— 插头DP的更多相关文章
- uva 11270 - Tiling Dominoes(插头dp)
题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...
- UVA11270 Tiling Dominoes
\(\color{#0066ff}{ 题目描述 }\) 给定一个m×n的矩形网格,用1×2多米诺骨牌完全平铺. 请注意,即使一个平铺的旋转与另一个平铺相匹配,它们仍算作不同的平铺. 下面显示了一个平铺 ...
- UVA11270 Tiling Dominoes(轮廓线动态规划)
轮廓线动态规划是一种基于状态压缩解决和连通性相关的问题的动态规划方法 这道题是轮廓线动态规划的模板 讲解可以看lrj的蓝书 代码 #include <cstdio> #include &l ...
- 插头dp
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...
- HDU 4113 Construct the Great Wall(插头dp)
好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...
- HDU 4949 Light(插头dp、位运算)
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...
- 插头DP专题
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...
- HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)
插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...
- HDU 1693 Eat the Trees(插头DP)
题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...
随机推荐
- [配置Cordova环境] [Alfred使用手册]
Mac神器 Alfred使用手册http://www.tuicool.com/articles/YJJv2i 配置Cordova环境 1.到nodejs官网下载最新版本,安装pkg文件 2.终端运行 ...
- miller_rabin + pollard_rho模版
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #incl ...
- 济南学习 Day 5 T2 am
車(Rook) [题目描述] 众所周知,車是中国象棋最厉害的棋子之一,他能吃到同一行或者同一列的其他棋子.車显然不能和車在一打起来,于是rly有借来了许多许多車在棋盘上摆了起来...... 他想知道, ...
- [C++] 频谱图中 FFT快速傅里叶变换C++实现
在项目中,需要画波形频谱图,因此进行查找,不是很懂相关知识,下列代码主要是针对这篇文章. http://blog.csdn.net/xcgspring/article/details/4749075 ...
- 标准C程序设计七---31
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- Django 中的时间处理
操作系统为OS X 10.9.2,Django为1.6.5. 1.时区 在setting.py文件中设置了时区 TIME_ZONE = 'Asia/Shanghai' # 设置时区为UTC+8 USE ...
- IntelliJ IDEA插件-常用插件
IntelliJ IDEA的插件真的很多,最近的新版集成的插件已经基本够用,下面是收集的一些常用插件,根据需要来安装和测试.如果还是没有找到,那么自己来开发一个. 官网:https://plugins ...
- Nginx负载均衡配置实例(转)
1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器.配置的例子如下: http{ upstream sampleapp { serv ...
- 解决树莓派8G的SD卡只能识别3.3G,SD卡扩容
8GB microSD在Windows下使用Win32 Disk Imager下载映像后,在RPi中只能识别出3.3GB.而本身还有很多容量没有释放出来. 使用sudo raspi-config工具可 ...
- linux下二机制文件的查看和编辑
linux下很多命令都是二机制:/bin/下的各种命令---/bin/sh./bin/cat./bin/dmesg./bin/hostname等 如何查看这些二机制文件: xxd.hexdump 参考 ...