2331: [SCOI2011]地板

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 541  Solved: 239
[Submit][Status]

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,一来就把R*C<=100看成R,C<=100,这道题主要问题还是在数据范围里面,交wa了一次,因为我默认R最大为10,而实际上R可以取到100.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MOD 20110520
#define MAXN 12
#define MAXV 531442
#define gv(x,ps) ((x)/p[(ps)]%3)
#define cd(x,ps) ((x)-((x)/p[ps]%3*p[ps]))
#define sd(x,ps,v) ((x)+v*p[ps])
int n,m;
void pm(int x)
{
int i;
for (i=;i<=m;i++)
{
printf("%d",x%);
x/=;
}
printf("\n");
}
void deal(int &x,int y)
{
x=(x+y)%MOD;
}
char mp[][];
int dp[][][MAXV];
int p[];
int main()
{
freopen("input.txt","r",stdin);
int i,j,k,x,y,z;
p[]=;
scanf("%d%d\n",&n,&m);
for (i=;i<;i++)
p[i]=p[i-]*;
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
scanf("%c",&mp[i][j]);
}
scanf("\n");
}
int l;
if (n<m)
{
for (i=;i<max(n,m);i++)
{
for (j=i+;j<max(n,m);j++)
{
swap(mp[i][j],mp[j][i]);
}
}
swap(n,m);
}
l=p[m+];
dp[][][]=;
int v;
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
if (j==m-)//{{{
{
if (mp[i][j]=='*')
{
for (k=;k<l;k++)
{
if (!dp[i&][j][k])continue;
x=gv(k,j);
y=gv(k,j+);
if (x||y)continue;
deal(dp[(i+)&][][k*],dp[i&][j][k]);
}
memset(dp[i&],,sizeof(dp[i&]));
}else
{
for (k=;k<l;k++)
{
if (!dp[i&][j][k])continue;
x=gv(k,j);
y=gv(k,j+);
v=cd(k,j);
v=cd(v,j+);
if (x== && y==)
{
z=sd(v,j,);
deal(dp[(i+)&][][z*],dp[i&][j][k]);
}else if (x== && y==)
{
z=sd(v,j,);
deal(dp[(i+)&][][z*],dp[i&][j][k]);
}else if (x== && y==)
{
z=sd(v,j,);
deal(dp[(i+)&][][z*],dp[i&][j][k]);
z=v;
deal(dp[(i+)&][][z*],dp[i&][j][k]);
}else if (x== && y==)
{
z=sd(v,j,);
deal(dp[(i+)&][][z*],dp[i&][j][k]);
}else if (x== && y==)
{
z=v;
deal(dp[(i+)&][][z*],dp[i&][j][k]);
}else if (x== && y==)
{
//DO nothing
}else if (x== && y==)
{
z=v;
deal(dp[(i+)&][][z*],dp[i&][j][k]);
}else if (x== && y==)
{
//Do nothing
}else if (x== && y==)
{
//Do nothing
}
}
memset(dp[i&],,sizeof(dp[i&]));
}
}else//}}}
{
if (mp[i][j]=='*')
{
for (k=;k<l;k++)
{
if (!dp[i&][j][k])continue;
x=gv(k,j);
y=gv(k,j+);
if (x||y)continue;
deal(dp[i&][j+][k],dp[i&][j][k]);
}
}else
{
for (k=;k<l;k++)
{
if (!dp[i&][j][k])continue;
x=gv(k,j);
y=gv(k,j+);
v=cd(k,j);
v=cd(v,j+);
if (x== && y==)
{
z=sd(v,j+,);
deal(dp[i&][j+][z],dp[i&][j][k]);
z=sd(v,j,);
deal(dp[i&][j+][z],dp[i&][j][k]);
z=sd(v,j+,);
z=sd(z,j,);
deal(dp[i&][j+][z],dp[i&][j][k]);
}else if (x== && y==)
{
z=sd(v,j+,);
deal(dp[i&][j+][z],dp[i&][j][k]);
z=sd(v,j,);
deal(dp[i&][j+][z],dp[i&][j][k]);
}else if (x== && y==)
{
z=v;
deal(dp[i&][j+][z],dp[i&][j][k]);
z=sd(v,j,);
deal(dp[i&][j+][z],dp[i&][j][k]);
}else if (x== && y==)
{
z=sd(v,j+,);
deal(dp[i&][j+][z],dp[i&][j][k]);
z=sd(v,j,);
deal(dp[i&][j+][z],dp[i&][j][k]);
}else if (x== && y==)
{
z=v;
deal(dp[i&][j+][z],dp[i&][j][k]);
}else if (x== && y==)
{
//Do nothing
}else if (x== && y==)
{
z=sd(v,j+,);
deal(dp[i&][j+][z],dp[i&][j][k]);
z=v;
deal(dp[i&][j+][z],dp[i&][j][k]);
}else if (x== && y==)
{
//Do nothing
}else if (x== && y==)
{
//Do nothing
}
}
}
}
}
}
cout<<dp[n&][][]<<endl;
return ;
}

bzoj 2331: [SCOI2011]地板 插头DP的更多相关文章

  1. BZOJ 2331 [SCOI2011]地板 ——插头DP

    [题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...

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

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

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

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

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

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

  5. bzoj:2331: [SCOI2011]地板

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

  6. bzoj 2331: [SCOI2011]地板【插头dp】

    一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...

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

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

  8. [SCOI2011][bzoj2331] 地板 [插头dp]

    题面: 传送门 思路: 插头dp基础教程 这个L形......第一眼看上去真的是丧病啊 但是仔细想想,实际上也就是拿一堆路径铺满一个棋盘,这个路径还是有限制的 那还有什么好说的,插头dp上啊[雾] 首 ...

  9. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

随机推荐

  1. Highcharts可拖动式图表

    Highcharts可拖动式图表 默认情况下,Highcharts依据给定的数据列生成图表. 浏览者是无法改动图表的. 假设浏览者须要手动调整数据节点.就须要借助第三方插件Draggable Poin ...

  2. 使用solrj操作solr索引库,solr是lucene服务器

    客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...

  3. 监听器 listener 样例

    1. 在web.xml 添加 <listener>    <listener-class>listener.TestListener</listener-class> ...

  4. LPC2378-Jlink 能下载程序,但是调试出现各种奇怪问题

    LPC2378-Jlink调试经验 1.Jlink(d版的没有关系)不能下载程序?     把下载速率设置到500Khz及以下的速率. 2.Jlink能在500Khz的速率下载程序,但是不能调试?添加 ...

  5. android检查自动升级

    好像大半年没发点啥了,也不知道自己瞎忙啥,闲下来发给最近的东东<安卓在线升级> 类已经封装好了,简单的调用就OK了.这里的数据交互,我是用.NET写的一个webservice来交互.废话也 ...

  6. PHP如何解决网站大流量与高并发的…

    首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...

  7. 自己做的demo---宣告可以在java世界开始自由了

    package $interface; public interface ILeaveHome { public abstract int a(); public abstract int b(); ...

  8. 今天把PHP复习了一下.

    记录一下今天复习内容. $_GET[''] $_POST $_SESSION $_COOKIE 常用的 $var='a'; global 全局变量$GLOBALS[''] $$var (动态变量名的变 ...

  9. [配置文件] C#修改App.config,Web.config文件帮助类,ConfigHelper (转载)

    点击下载 ConfigHelper-sufei.rar 主要功能如下 .根据Key取Value值 .根据Key修改Value .添加新的Key ,Value键值对 .根据Key删除项 /// < ...

  10. 收集统计信息让SQL走正确的执行计划

    数据库环境:SQL SERVER 2005 今天在生产库里抓到一条跑得慢的SQL,语句不是很复杂,返回的数据才有800多行, 却执行了34分钟,甚至更久. 先看一下执行结果 我贴一下SQL. SELE ...