bzoj2331 [SCOI2011]地板
Description
lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西。小L家的客厅是一个
的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板。现在小L想知道,用L型的地板铺满整个客厅有多少种不同的方案?
需要注意的是,如下图所示,L型地板的两端长度可以任意变化,但不能长度为0。铺设完成后,客厅里面所有没有柱子的地方都必须铺上地板,但同一个地方不能被铺多次。

Input
输入的第一行包含两个整数,R和C,表示客厅的大小。
接着是R行,每行C个字符。’_’表示对应的位置是空的,必须铺地板;’*’表示对应的位置有柱子,不能铺地板。
Output
输出一行,包含一个整数,表示铺满整个客厅的方案数。由于这个数可能很大,只需输出它除以20110520的余数。
Sample Input
*_
__
Sample Output
HINT
R*C<=100
正解:插头$dp$。
插头$dp$第一题,写了巨久。。
这道题还是比较裸的,我们把轮廓线的状态分为$3$种情况,没有插头,插头没拐弯,插头已经拐过弯了,然后就很好转移了。
在每一行的最后一个格子转移的时候要特判。轮廓线到下一行要左移一位。注意用$4$进制比$3$进制常数更小,$4$进制状态较大,所以要手写$hash$。
#include <bits/stdc++.h>
#define ll long long
#define RG register
#define il inline
#define M (1<<22)
#define rhl (20110520)
#define w(s,p) ((s)>>((p)<<1)&3)
#define upd(s,p,v) ((s)^(w(s,p)<<((p)<<1))^((v)<<((p)<<1))) using namespace std; int vis[M],S[][M],f[][M],sz[M],g[][],n,m,pre,cur,ans; il char gc(){
RG char ch=getchar();
while (ch!='*' && ch!='_') ch=getchar(); return ch;
} il void add(RG int s,RG int v){
if (vis[s]){
f[cur][vis[s]]+=v;
if (f[cur][vis[s]]>=rhl) f[cur][vis[s]]-=rhl;
return;
}
vis[s]=++sz[cur],S[cur][sz[cur]]=s,f[cur][sz[cur]]=v; return;
} int main(){
#ifndef ONLINE_JUDGE
freopen("floor.in","r",stdin);
freopen("floor.out","w",stdout);
#endif
cin>>n>>m;
for (RG int i=;i<=n;++i)
for (RG int j=;j<=m;++j)
if (n>=m) g[i][j]=gc()=='_'; else g[j][i]=gc()=='_';
if (n<m) swap(n,m); sz[]=f[][]=;
for (RG int i=;i<=n;++i){
for (RG int k=;k<=sz[cur];++k) (S[cur][k]<<=)&=(<<((m+)<<))-;
for (RG int j=;j<=m;++j){
pre=cur,sz[cur^=]=;
if (!g[i][j]){
for (RG int k=;k<=sz[pre];++k)
if (!w(S[pre][k],j-) && !w(S[pre][k],j) && f[pre][k]) add(S[pre][k],f[pre][k]);
for (RG int k=;k<=sz[cur];++k) vis[S[cur][k]]=; continue;
}
for (RG int k=,x,y,s,v;k<=sz[pre];++k){
s=S[pre][k],v=f[pre][k]; if (!v) continue;
x=w(s,j-),y=w(s,j);
if (!x && !y){
if (g[i][j+]) add(upd(upd(s,j-,),j,),v);
if (g[i+][j]) add(upd(upd(s,j-,),j,),v);
if (g[i][j+] && g[i+][j]) add(upd(upd(s,j-,),j,),v);
}
if (!x && y==){
if (g[i+][j]) add(upd(upd(s,j-,),j,),v);
if (g[i][j+]) add(upd(upd(s,j-,),j,),v);
}
if (x== && !y){
if (g[i][j+]) add(upd(upd(s,j-,),j,),v);
if (g[i+][j]) add(upd(upd(s,j-,),j,),v);
}
if (!x && y==){
add(upd(upd(s,j-,),j,),v);
if (g[i+][j]) add(upd(upd(s,j-,),j,),v);
}
if (x== && !y){
add(upd(upd(s,j-,),j,),v);
if (g[i][j+]) add(upd(upd(s,j-,),j,),v);
}
if (x== && y==) add(upd(upd(s,j-,),j,),v);
}
for (RG int k=;k<=sz[cur];++k) vis[S[cur][k]]=;
}
}
for (RG int i=;i<=sz[cur];++i) if (!S[cur][i]) ans=f[cur][i];
cout<<ans; return ;
}
bzoj2331 [SCOI2011]地板的更多相关文章
- 【BZOJ2331】[SCOI2011]地板 插头DP
[BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...
- bzoj 2331: [SCOI2011]地板 插头DP
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
- BZOJ2331:[SCOI2011]地板——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2331 题面复制于洛谷 题目描述 lxhgww的小名叫”小L“,这是因为他总是很喜欢L型的东西.小L家 ...
- 【bzoj2331】[SCOI2011]地板
题目链接: TP 题解: 分类讨论好烦啊! 0表示没有插头,1.2表示有插头,1表示接下来可以转弯,2表示接下来不能转弯,只能停在一个地方. 然后分类讨论: 插头状态 到达状态 0 0 2 2 | 1 ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- 2331: [SCOI2011]地板 插头DP
国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...
- 【BZOJ】2331: [SCOI2011]地板
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- P3272 [SCOI2011]地板
\(\color{#0066ff}{ 题目描述 }\) lxhgww的小名叫"小L",这是因为他总是很喜欢L型的东西.小L家的客厅是一个R*C的矩形,现在他想用L型的地板来铺满整个 ...
随机推荐
- 利用Map解决复杂业务
遍历出题库表的题库名称和题库id,根据题目id即questionBankId获取 分组,即该题库题目总数,该题库题目正确数,该题库已回答题目数. <sqltemplate id="co ...
- 【关于迭代器的for-each遍历集合现象。。。。。】
foreahc迭代集合元素的同时修改集合元素抛异常..ConcurrentModificationException异常 只要使用迭代器遍历,其他集合遍历时进行增删操作都需要留意是否会触发Concur ...
- php根据IP获取所在省份-百度api接口
这里用的file_put_contents,你也可以用别的,直接怼代码: //拼接传递的参数 $getData = array( 'query' => '127.0.0.1', 'resourc ...
- requirejs和seajs使用感受
这几天看了下前端模块化的知识,主要是requirejs和seajs相关的知识,还未看es6的模块化知识. 由于目前项目组内的开始推广使用vue,并且开始简单的封装组件,但发现组件js的使用方式依然是原 ...
- ASP.Net Core MVC 网站在Windows服务器跑不起来
1.vs远程发布到服务器,浏览器访问,报错502 2.打开错误提示提供的网址参考 3.安装runtime,sdk,Hosting Bundle Installer,其他操作 .....发现并没有什么用 ...
- Spring Cloud个组件原理
引言 面试中面试官喜欢问组件的实现原理,尤其是常用技术,我们平时使用了SpringCloud还需要了解它的实现原理,这样不仅起到举一反三的作用,还能帮助轻松应对各种问题及有针对的进行扩展.以下是 课程 ...
- Gradle sync failed: Cause: org.gradle.logging.StyledTextOutput$Style Consult IDE log for more details
环境 Android studio 3.0 导入开源中国: ... dependencies { //noinspection GradleDependency classpath 'com.andr ...
- 互联网轻量级框架SSM-查缺补漏第九天
简言: 第九章 Spring Ioc的概念 IoC(Inversion of Control)控制反转:比如想喝橙汁,在没有饮品店的日子,最直观的做法是买果汁机.橙汁.这是你自己“主动”创造的过程,也 ...
- poj 1155 树形背包
http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tre ...
- k8s安装部署过程个人总结及参考文章
以下是本人安装k8s过程 一.单机配置 1. 环境准备 主机名 IP 配置 master1 192.168.1.181 1C 4G 关闭所有节点的seliux以及firewalld sed -i 's ...