【BZOJ2331】[SCOI2011]地板 插头DP
【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
题解:我们取R和C中小的那维做状态。显然状态是三维的:对于轮廓线上的每个位置,用0表示无插头,1表示有插头,并且这个L还没有拐弯,2表示有插头,并且L已经拐弯了。然后进行3*3的讨论吧!注意一个拐过弯的插头可以停止,一个没拐过弯的插头可以拐弯。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=177200;
const int P=20110520;
int n,m,k,tag,tot;
char str[110][110];
int dp[2][maxn],bt[20],m3[maxn];
inline void upd(int a) {dp[k][a]+=tag; if(dp[k][a]>=P) dp[k][a]-=P;}
int main()
{
scanf("%d%d",&n,&m);
int i,j,S,T,p,q,x,y;
for(i=1;i<=n;i++) scanf("%s",str[i]+1);
if(n<m)
{
for(i=1;i<=m;i++) for(j=1;j<i;j++) swap(str[i][j],str[j][i]);
swap(n,m);
}
for(i=bt[0]=1;i<=m+1;i++) bt[i]=bt[i-1]*3;
for(tot=bt[m+1],i=1;i<tot;i++) m3[i]=i%3;
dp[0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
k^=1;
memset(dp[k],0,sizeof(dp[k]));
for(S=0;S<tot;S++) if(dp[k^1][S])
{
x=bt[j-1],y=bt[j],p=m3[S/x],q=m3[S/y],tag=dp[k^1][S],T=S-x*p-y*q;
if(str[i][j]=='*')
{
if(!p&&!q) upd(T);
continue;
}
if(!p&&!q)
{
if(i!=n&&j!=m) upd(T+((x+y)<<1));
if(i!=n) upd(T+x);
if(j!=m) upd(T+y);
}
if(!p&&q==1)
{
if(i!=n) upd(T+x);
if(j!=m) upd(T+(y<<1));
}
if(!p&&q==2)
{
if(i!=n) upd(T+(x<<1));
upd(T);
}
if(!q&&p==1)
{
if(j!=m) upd(T+y);
if(i!=n) upd(T+(x<<1));
}
if(!q&&p==2)
{
if(j!=m) upd(T+(y<<1));
upd(T);
}
if(p==1&&q==1) upd(T);
}
}
for(S=tot-1;S>=0;S--) dp[k][S]=(m3[S]>0)?0:dp[k][S/3];
}
printf("%d",dp[k][0]);
return 0;
}//10 10 __________ __________ __________ __________ __________ __________ __________ __________ __________ __________
【BZOJ2331】[SCOI2011]地板 插头DP的更多相关文章
- bzoj 2331: [SCOI2011]地板 插头DP
		
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
 - 2331: [SCOI2011]地板 插头DP
		
国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...
 - 【BZOJ】2331: [SCOI2011]地板 插头DP
		
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
 - BZOJ 2331 [SCOI2011]地板 ——插头DP
		
[题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...
 - [SCOI2011][bzoj2331] 地板 [插头dp]
		
题面: 传送门 思路: 插头dp基础教程 这个L形......第一眼看上去真的是丧病啊 但是仔细想想,实际上也就是拿一堆路径铺满一个棋盘,这个路径还是有限制的 那还有什么好说的,插头dp上啊[雾] 首 ...
 - bzoj2331 [SCOI2011]地板
		
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
 - 插头dp初探
		
问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...
 - 插头dp题表
		
bzoj1814: Ural 1519 Formula 1 bzoj3125: CITY bzoj1210: [HNOI2004]邮递员 bzoj2331: [SCOI2011]地板 bzoj1187 ...
 - [BZOJ2331]地板(插头DP)
		
Description lxhgww的小名叫"小L",这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板 ...
 
随机推荐
- window.frames[]在Firefox下无法兼容的解决方式
			
html代码段: <iframe id="fr" src="ProjectTree.aspx?IsFree=true&f=yes&IsCheckPr ...
 - Git使用教程,从入门到上瘾
			
Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史,这几乎是所有操作的本质,但是为了文章更加简单易懂, ...
 - ABBYY FineReader 12没你想得那么简单
			
你是否觉得自己对ABBYY FineReader 12已经了如指掌了?也许你会认为它不过就是一款OCR文字识别软件,能够快速方便地将扫描纸质文档.PDF文件或者数码相机的图像转换为可编辑.可搜索的格式 ...
 - 怎么解决BarTender因为未检测到IIS安装失败的问题
			
个别小伙伴在安装BarTender条码标签设计软件的时候,遇到“未检测到IIS,无法安装BarTender Web Print Server配套程序”导致安装失败的问题,本文小编给大家分享解决BarT ...
 - 让Zend Studio联系关系CakePHP模板文件.ctp
			
让Zend Studio关联CakePHP模板文件.ctp Zend Studio是套强大的PHP编辑器,各种给力让PHP开发者爱不释手.对于CakePHP程序员来说,有件事情相当头疼,在初始安装好Z ...
 - 如何将会员名单加入LINE@生活圈?
			
如何将会员名单加入LINE@生活圈? 我要如何将会员名单加入LINE@生活圈呢?答案是没有办法利用LINE@生活圈直接加入会员名单,LINE@生活圈是许可式行销,必须由LINE好友主动将LINE@生活 ...
 - 架构设计:系统存储(28)——分布式文件系统Ceph(挂载)
			
(接上文<架构设计:系统存储(27)--分布式文件系统Ceph(安装)>) 3. 连接到Ceph系统 3-1. 连接客户端 完毕Ceph文件系统的创建过程后.就能够让客户端连接过去. Ce ...
 - SpringMVC -- 梗概--源码--贰--mvc:annotation-driven
			
1>在springMVC的处理流程中,有两个重要组件:HandlerMapping和HandlerAdapter 分别负责解析Handler和执行Handler 2>如果配置了<mv ...
 - 处理特殊格式的GET传参
			
有群友问 这样的传参格式如何接受获取 xx.php?con="one"=>5,"two"=>0,"three"=>1 那么 ...
 - BootStrap Table将时间戳更改为日期格式
			
一.使用BootStrap Table遇到的问题: 1.MyBatis从数据库中取出的时间格式如下:2017-12-04 21:43:19.0,时间后面多了一个点零. 2.从BootStrap Tab ...