Description

lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西。小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板。现在小L想知道,用L型的地板铺满整个客厅有多少种不同的方案?

需要注意的是,如下图所示,L型地板的两端长度可以任意变化,但不能长度为0。铺设完成后,客厅里面所有没有柱子的地方都必须铺上地板,但同一个地方不能被铺多次。

Input

输入的第一行包含两个整数,R和C,表示客厅的大小。

接着是R行,每行C个字符。’_’表示对应的位置是空的,必须铺地板;’*’表示对应的位置有柱子,不能铺地板。

Output

输出一行,包含一个整数,表示铺满整个客厅的方案数。由于这个数可能很大,只需输出它除以20110520的余数。

Sample Input

2 2
*_
__

Sample Output

1

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]地板的更多相关文章

  1. 【BZOJ2331】[SCOI2011]地板 插头DP

    [BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...

  2. bzoj 2331: [SCOI2011]地板 插头DP

    2331: [SCOI2011]地板 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 239[Submit][Status] D ...

  3. BZOJ2331:[SCOI2011]地板——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2331 题面复制于洛谷 题目描述 lxhgww的小名叫”小L“,这是因为他总是很喜欢L型的东西.小L家 ...

  4. 【bzoj2331】[SCOI2011]地板

    题目链接: TP 题解: 分类讨论好烦啊! 0表示没有插头,1.2表示有插头,1表示接下来可以转弯,2表示接下来不能转弯,只能停在一个地方. 然后分类讨论: 插头状态 到达状态 0 0 2 2 | 1 ...

  5. bzoj:2331: [SCOI2011]地板

    Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...

  6. 2331: [SCOI2011]地板 插头DP

    国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...

  7. 【BZOJ】2331: [SCOI2011]地板

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...

  8. 【BZOJ】2331: [SCOI2011]地板 插头DP

    [题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...

  9. P3272 [SCOI2011]地板

    \(\color{#0066ff}{ 题目描述 }\) lxhgww的小名叫"小L",这是因为他总是很喜欢L型的东西.小L家的客厅是一个R*C的矩形,现在他想用L型的地板来铺满整个 ...

随机推荐

  1. CentOS 升级 openSSH

    openSSH作为linux远程连接工具,容易受到攻击,必须更新版本来解决,低版本有如下等漏洞: a. OpenSSH 远程代码执行漏洞(CVE-2016-10009) b.  OpenSSH aut ...

  2. Android OpenGL教程-第三课【转】

    第三课 给多边形上色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色. 这次增加的代码不算多. 增加一个color的buffer ...

  3. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

  4. 深入理解JavaScript系列(42):设计模式之原型模式

    介绍 原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象. 正文 对于原型模式,我们可以利用JavaScript特有的原型继承特性去创建对象的方式,也就是 ...

  5. jQuery中遇到的坑

    在jQuery 1.6之前,只有attr()函数可用,该函数不仅承担了attribute的设置和获取工作,还同时承担了property的设置和获取工作.例如:在jQuery 1.6之前,attr()也 ...

  6. [转]微信小程序填坑之路之使用localhost在本地测试

    本文转自:http://www.wxappclub.com/topic/798

  7. (转)The remote certificate is invalid according to the validation procedure

    If you get “The remote certificate is invalid according to the validation procedure” exception while ...

  8. Java数组逆序存储

    package review01; import java.util.Arrays; public class review01 { public static void main(String[] ...

  9. flex固定底部栏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. sql server query to get the list of column name in a table

    --SQL Server 2005, 2008 or 2012: SELECT * FROM information_schema.tables --SQL Server 2000: SELECT * ...