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. Image控件播放 GIF文件

    uses Vcl.Imaging.GIFImg;procedure TForm1.Button2Click(Sender: TObject);begin    Image1.Picture.LoadF ...

  2. FastDFS分布文件系统[转]

    FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片.视频.文档等文件.对于互联网应用,和其他分布式文件系统相比,优势非常明显.具体情况大家可以看相关的介绍文档,包括 ...

  3. 启动MYSQL密码审计插件

    http://www.innomysql.com/article/25717.html [root@server-mysql plugin]# pwd /usr/local/mysql56/lib/p ...

  4. 深度剖析:CDN内容分发网络技术原理--转载

    1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...

  5. MVC缓存,使用数据层缓存,添加或修改时让缓存失效

    在"MVC缓存01,运用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有用时刻.但这个还不够"智能",常常期望在修改或创立的时分使缓存失效,加载新的数据. ...

  6. grep参数说明及常用用法

    grep参数说明及常用用法 趁着午休的时间把自己经常使用的一些grep命令整理一下. 方便以后查看. 后续会逐步把awk/sed/find等常用的命令理一理. 增强下记忆. 也算是对得起自己了. ^^ ...

  7. C#设置与获取目录权限(.net控制ACL)

    找到两种方式可以修改文件夹的权限 第一种: 想用c#来设置和读取ntfs分区上的目录权限,找了很多资料,未果.终于发现了一段vb.net的代码,做了修改,以C#展示给大家. using System; ...

  8. 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则

    转载:http://space.itpub.net/17007506/viewspace-616852 腾讯QQGame游戏同时在线的玩家数量极其庞大,为了方便组织玩家组队游戏,腾讯设置了大量游戏室( ...

  9. python基础知识四

    函数是重用的程序段.它们允许你给一块语句一个名称, 然后你可以在你的程序的任何地方使用这个名称多次地运行这个语句块.这被成为调用函数.我们已经使用了许多内建的函数,比如len和range. 函数通过d ...

  10. onTextChanged参数解释及实现EditText字数监听

    http://www.picksomething.cn/?p=34 由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher ...