【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型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板 ...
随机推荐
- 【WP8】图片压缩处理
最近在做图片上传功能,类似于微信朋友圈的功能,现在的手机像素都比较高,手机上的图片一般都比较大(几M),对于大图,在上传之前,我们需要对图片进行压缩(分辨率和质量),再上传到服务器,以减少网路流量传输 ...
- 使用 CGContextRef 进行简单内容绘制
摘要 : CGContextRef 功能强大,我们借助它可以画各种图形.这里所举例子只是简单内容绘制,冰山一角,对此感兴趣的朋友可以举一反三,实现各种酷炫效果. 效果如下: KMDrawView.h ...
- Node.js+Express on IIS(续)
前一篇文章介绍了如何用iis来伺服node网站(开发期间特别有用),结果还落掉一点,我们用node来做restful服务的时候,很多时候可能要响应500系列的状态码,并不是整个系统从头到尾都是200, ...
- vue select下拉框绑定默认值
vue select下拉框绑定默认值: 首先option要加value值,以便v-model可以获取到对应选择的值 一.当没有绑定v-model,直接给对应的option加selected属性 二.当 ...
- virtualbox谨记:续....
接“virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以”, 续 me自 ...
- nginx配置:location配置方法及实例
转载:https://blog.csdn.net/heiyueya/article/details/70149270 location匹配的是nginx的哪个变量? $request_uri loca ...
- [Bayes] What is Sampling
Ref: http://blog.csdn.net/xianlingmao/article/details/7768833 通常,我们会遇到很多问题无法用分析的方法来求得精确解,例如由于式子特别,真的 ...
- Javascript生成GUID算法
var GUID = { date: new Date(), /* 生成GUID码 */ newGUID: function () { this.date = new Date(); var guid ...
- Extjs表单验证小结
//放在onReady的function(){}中 Ext.QuickTips.init(); //为组件提供提示信息功能,form的主要提示信息就是客户端验证的错误信息. Ext.form.Fiel ...
- 【ArcGIS】ArcGIS Enterprise部署
单机部署 多层部署 高可用性部署