题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331


一眼插头DP...

考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了弯的还是没有拐弯的。
所以$4$进制表示,$0$表示没有插头,$1$表示插头指向拐点,$2$表示插头离开拐点。

转移:

令${(x,y)}$表示当前点左插头和上插头的形态。

${(0,0)}$------>${(0,1)}$,${(1,0)}$,${(2,2)}$

${(0,1)}$------>${(1,0)}$,${(0,2)}$

${(0,2)}$------>${(0,0)}$,${(2,0)}$

${(1,0)}$------>${(0,1)}$,${(2,0)}$

${(2,0)}$------>${(0,0)}$,${(0,2)}$

当然如果有障碍就不能走。


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10010
#define llg long long
#define SIZE 10007
#define md 20110520
#define maxnZT (1<<21)
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,code[maxn],zt[][maxnZT],v[][maxnZT],g[][],size[],now,la; struct node
{
llg pos,x,val;
}; vector<node>a[][SIZE]; void outcode(llg x){for (llg i=;i<=m;i++) code[i]=x&,x>>=;} void encode(llg p,llg val)
{
llg x=;
for (llg i=;i<=m;i++) x+=code[i]*(<<(i*));
llg wz=x%SIZE,E=a[p][wz].size();
for (llg i=;i<E;i++)
if (a[p][wz][i].x==x)
{
a[p][wz][i].val+=val; a[p][wz][i].val%=md;
v[p][a[p][wz][i].pos]+=val; v[p][a[p][wz][i].pos]%=md;
return ;
}
size[p]++;
node NEW;
NEW.pos=size[p],NEW.x=x,NEW.val=val;
a[p][wz].push_back(NEW);
zt[p][size[p]]=x; v[p][size[p]]=val;
} void init()
{
cin>>n>>m;
char ch;
for (llg i=;i<=n;i++)
for (llg j=;j<=m;j++)
{
ch=getchar();
while (ch!='*' && ch!='_') ch=getchar();
if (n<m) g[j][i]=(ch=='_');
else g[i][j]=(ch=='_');
}
if (n<m) swap(n,m);
} void init_a(llg p){for (llg i=;i<SIZE;i++) a[p][i].clear(); size[p]=;} void DP()
{
llg le,up,V;
encode(,);
for (llg i=;i<=n;i++)
{
for (llg k=;k<=size[now];k++) zt[now][k]*=;//轮廓线左移一格
for (llg j=;j<=m;j++)
{
now^=; la=now^; size[now]=;
init_a(now);
for (llg k=;k<=size[la];k++)
{
outcode(zt[la][k]);
le=code[j-],up=code[j],V=v[la][k];//提取左插头和上插头 if (g[i][j]==)
{
if (le== && up==) encode(now,V);
continue;
} if (!le && !up)
{
if (j<m && g[i][j+]==)
{
code[j-]=,code[j]=;
encode(now,V);
if (g[i+][j]==)
{
code[j-]=code[j]=;
encode(now,V);
}
}
if (g[i+][j]==)
{
code[j-]=,code[j]=;
encode(now,V);
}
continue;
} if (le && up)
{
if (le== && up==)
{
code[j-]=code[j]=;
encode(now,V);
}
continue;
} if (le== && up==)
{
if (g[i+][j]==)
{
code[j-]=;
encode(now,V);
}
if (g[i][j+]== && j<m)
{
code[j]=; code[j-]=;
encode(now,V);
}
continue;
} if (le== && up==)
{
if (j<m && g[i][j+]==)
{
code[j]=; code[j-]=;
encode(now,V);
}
code[j]=code[j-]=;
encode(now,V);
continue;
} if (le== && up==)
{
if (g[i+][j]==)
{
code[j-]=,code[j]=;
encode(now,V);
}
if (j<m && g[i][j+]==)
{
code[j-]=; code[j]=;
encode(now,V);
}
continue;
} if (le== && up==)
{
if (g[i+][j]==)
{
code[j]=,code[j-]=;
encode(now,V);
}
code[j-]=code[j]=;
encode(now,V);
continue;
}
}
}
}
} int main()
{
yyj("BZOJ2331");
init();
DP();
llg ans=;
bool pd;
for (llg i=;i<=size[now];i++)
{
outcode(zt[now][i]);
pd=true;
for (llg j=;j<=m;j++) if (code[j]) pd=false;
if (pd) ans+=v[now][i];
}
cout<<ans%md;
return ;
}

【BZOJ】2331: [SCOI2011]地板的更多相关文章

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

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

  2. bzoj:2331: [SCOI2011]地板

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ 2331 地板

    妈妈我会写插头dp了!!!!!!.... 感动啊... #include<iostream> #include<cstdio> #include<cstring> ...

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

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

随机推荐

  1. SQL数据库增量备份还原方式

    SQLSERVER2008的备份还原最基本的方式自然是完整备份,然后完整还原即可. 但是如果遇到数据库文件很大,数据量很大,备份和还原需要花费不少时间的时候, 数据库的差异备份自然就成为考虑的备份方案 ...

  2. zabbix实现电话、短信、邮件报警

    该报警方式提前说明:(1)该方式可以实现zabbix免费电话报警以及微信.短信.邮件报警,但有数量限制.详见如下:如数量不能满足需要以及人员需要,可以考虑购买收费版.(2)毕竟是免费版,电话通知要省着 ...

  3. LINUX搭建PySpider爬虫服务

    1.环境搭建 yum update -y yum install gcc gcc-c++ -y yum install python-pip python-devel python-distribut ...

  4. GoldenGate实时投递数据到大数据平台(6)– HDFS

    GoldenGate可以实时将RDBMS的数据投递到HDFS中,在前面的文章中,已经配置过投递到kafka, mongodb等数据平台,本文通过OGG for bigdata的介质中自带的示例演示实时 ...

  5. 数据分析之Matplotlib

    一.Matplotlib的基础知识     Matplotlib中的基本图表包括的元素     •x轴和y轴 axis     水平和垂直的轴线     •x轴和y轴刻度 tick     刻度标示坐 ...

  6. 使用Oracle数据库时的org.springframework.jdbc.BadSqlGrammarException:

    org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...

  7. 利用cookies跳过登陆验证码

    前言在爬取某些网页时,登陆界面时经常遇到的一个坎,而现在大多数的网站在登陆时都会要求用户填写验证码.当然,我们可以设计一套机器学习的算法去破解验证码,然而,验证码的形式多种多样,稍微变一下(有些甚至是 ...

  8. django 函数装饰器 变为 类装饰器

    aaa  

  9. Spring Boot(十三):spring boot小技巧

    Spring Boot(十三):spring boot小技巧 一.初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDB ...

  10. ORA-38301: 无法对回收站中的对象执行 DDL/DML

    我们是在生产系统中遇到,清空回收站,然后禁用回收站即可,这样后面就不会发生,单纯禁用可能仍会报错,因为不会自动清空回收站. purge recyclebin; alter system set rec ...