UVa 11270 铺放骨牌(轮廓线DP)
https://vjudge.net/problem/UVA-11270
题意:
用1×2骨牌覆盖n×m棋牌,有多少种方法?
思路:
这道题目是典型的轮廓线DP题。
所谓轮廓线DP,就是以整行整列为状态进行动态规划时无法进行状态转移,那么此时就可以用到轮廓线,当然,这种方法只能使用在一个窄棋盘上,大了肯定是不行的,要超时!
'
轮廓线DP就是按照从上到下,从左到右的顺序进行状态转移,每个格子用二进制来表示状态,1代表的就是覆盖,0代表未覆盖。
以本题为例,如上图,我们现在要计算 k 格子,那么与它有关的就是k4 k3 k2 k1 k0这5个格子。
现在,我们对于每个格子都有三种决策:
1、不放
不放的条件是其上面的格子必须是1(也就是k4必须是1),否则无法覆盖所有的棋盘的。
如果满足条件,那么就进行状态转移,d[cur][新状态]+=d[1-cur][旧状态],也就是d[cur][k3k2k1k0k]+=d[1-cur][k4k3k2k1k0]。
2、上放
上放的条件是其上面的格子必须是0。
3、左放
左放的条件其左边的格子必须是0。
具体的算法实现请参见代码。
注意:这道题目数组开小点,开到1<<15会TLE,11就可以了!!
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn=; int n,m;
int cur;
ll d[][<<maxn]; void update(int a,int b) //a是m位的旧状态,b是m+1位的新状态
{
if(b&(<<m)) d[cur][b^(<<m)]+=d[-cur][a]; //先检查新状态的轮廓线首是否为1,是1则更新状态
} //因为轮廓线首位1,所以b^(1<<m)就是将首位置为0,将新状态变成m位 int main()
{
while(scanf("%d%d",&n,&m)==)
{
if(n<m) swap(n,m);
memset(d,,sizeof(d));
d[][(<<m)-]=;
cur=;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cur^=;
memset(d[cur],,sizeof(d[cur]));
for(int k=;k < (<<m);k++)
{
update(k,k<<); //不放,直接将二进制左移一位形成新状态
if(i && !(k&(<<m-))) update(k,(k<<)^(<<m)^); //上放,要求轮廓线首为0且为非首行
if(j && !(k&)) update(k,(k<<)^); //左放,要求轮廓线首为1,尾为0,且为非首列
}
}
}
printf("%lld\n",d[cur][(<<m)-]);
}
return ;
}
UVa 11270 铺放骨牌(轮廓线DP)的更多相关文章
- [ACM_动态规划] 轮廓线动态规划——铺放骨牌(状态压缩1)
Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...
- poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
题目链接 题意 用\(1\times 2\)的骨牌铺满\(H\times W(H,W\leq 11)\)的网格,问方案数. 思路 参考focus_best. 竖着的骨牌用\(\begin{pmatri ...
- 铺放骨牌 uva11270
题解: 插头dp裸题 没什么好说的啊就是n个二进制位表示状态 相比原先就是用2n个二进制位表示状态 蓝书上后面几题插头dp都挺烦的啊... 代码:
- HDU 1565 方格取数(1) 轮廓线dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...
- HDU1565 方格取数 &&uva 11270 轮廓线DP
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- UVA - 11270 轮廓线DP
其实这题还能用状压DP解决,可是时间达到2000ms只能过掉POJ2411.状压DP解法详见状压DP解POJ2411 贴上POJ2411AC代码 : 2000ms 时间复杂度h*w*(2^w)*(2^ ...
- uva 11270 - Tiling Dominoes(插头dp)
题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...
- 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)
Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...
- HDU_2046——骨牌铺放问题,递推
Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: In ...
随机推荐
- [UML]UML 教程 - 第二部分
UML作为软件开发典型的开发过程 业务过程模型创建 业务过程模型被用来定义发生在企业或组织内部的高级业务活动和业务过程,并且是建立用例模型的基础.一般来说业务过程模型比一个软件系统所能实现的更多(比如 ...
- Android 使用动画效果后的控件位置处理 类似系统通知栏下拉动画
Android的动画的使用,请参考.Android的动画,在设计方面,我有点不太理解,觉得这样搞很怪,因为在控件动画后,即使设置了停留在动画结束时的位置,我们也确实看到了控件停在那个位置,但其实该控件 ...
- This function has none of DETERMINISTIC, NO SQL
错误信息: [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declara ...
- 三维凸包求凸包表面的个数(HDU3662)
3D Convex Hull Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- yii2框架dropDownList的下拉菜单用法介绍
Yii2.0 默认的 dropdownlist 的使用方法. 代码如下 复制代码 <?php echo $form->field($model, 'name[]')->dropDo ...
- 如何用css给input的placeholder设置颜色
我在做页面的时候遇到过这种情况,在input标签中有默认字,但是设计稿上的颜色和input标签中的placeholder的默认颜色不一致.虽然我们可以在js中写出,但是有点过于麻烦了. 所以我就用cs ...
- python基础之迭代器协议和生成器
迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...
- Python开发【Django】:中间件、CSRF
CSRF 1.概述 CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用 ...
- Mysql5.6主从复制
搭建(192.168.1.10 -> 192.168.1.20) 1 master 上执行 阻塞 DMLflush tables with read lock; 记录 File 和 Positi ...
- xmr monero miner
https://github.com/fireice-uk/xmr-stak-cpu xmr-stak-cpu安装 xmr-stak-cpu是一个用于cpu计算的开源软件,下面记录在ubuntu17. ...