题目链接:

  TP

题解:

  分类讨论好烦啊!

  0表示没有插头,1、2表示有插头,1表示接下来可以转弯,2表示接下来不能转弯,只能停在一个地方。

  然后分类讨论:

插头状态 到达状态
0 0 2 2 | 1 0 | 0 1

0 1

0 2

0 2 | 1 0

0 0 | 0 2

1 0

2 0

与上列相反

1 1

0 0

  对于[0 2]的讨论容易想错,开始我想可以在下面会变成[1 0],然而发现WA了,仔细思考发现我想的在下面转弯完全可以在这里断掉,然后再开一个新的,我只要在意当前这个L型砖的走向即可。

代码:

  

 #define Troy

 #include <bits/stdc++.h>

 using namespace std;

 const int mod=,
N=2e5+; int n,m,c,xx,yy,dp[][N],tot[],stk[][N],h[N],bit[],ans; char mp[][]; inline void reversal(){
char s[][];
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
s[j][i]=mp[i][j];
memcpy(mp,s,sizeof(mp));
swap(n,m);
} inline void _plus(int &x,int y){
x+=y;
if(x>=mod) x-=mod;
} struct edges{
int v;edges *last;
}edge[N],*head[(int)4e4];int cnt; inline void push(int s,int val){
int pos=s%;
for(edges *i=head[pos];i;i=i->last){
if(stk[c][i->v]==s){
(dp[c][i->v]+=val)%=mod;
return ;
}
}
// while(h[pos]!=-1){
// if(stk[t][h[pos]]==s){
// dp[t][h[pos]]+=val;
// return ;
// }
// ++pos;
// if(pos==N) pos=0;
// }
dp[c][++tot[c]]=val; stk[c][tot[c]]=s;
edge[++cnt]=(edges){tot[c],head[pos]};head[pos]=edge+cnt;
} inline void DP(){
dp[][]=,tot[]=;
register int i,j,k;
for(i=;i<=n;++i){
for(j=;j<=tot[c];++j) stk[c][j]<<=;
for(j=;j<=m;++j){
c^=;tot[c]=;cnt=;
memset(head,,sizeof(head));
for(k=;k<=tot[c^];++k){
int s=stk[c^][k],p=(s>>bit[j-])&,q=(s>>bit[j])&;
int val=dp[c^][k];
if(!mp[i][j]){
if(!p&&!q) push(s,val);
}else if(!p&&!q){
int x;
if(mp[i+][j]){
x=s+(<<bit[j-]);
push(x,val);
}if(mp[i][j+]){
x=s+(<<bit[j]);
push(x,val);
}if(mp[i+][j]&&mp[i][j+]){
s+=(<<bit[j-])+(<<bit[j])<<;
push(s,val);
}
}else if(!p){
if(q==){
if(mp[i+][j]){
push(s^(<<bit[j-]^(<<bit[j])),val);
}
if(mp[i][j+]){
push(s+(<<bit[j]),val);
}
}else{
s^=q<<bit[j];
push(s,val);
if(mp[i+][j])
push(s^(<<bit[j-]+),val);
}
}else if(!q){
if(p==){
if(mp[i][j+]){
push(s^(<<bit[j-]^(<<bit[j])),val);
}
if(mp[i+][j]){
push(s+(<<bit[j-]),val);
}
}else{
s^=(<<bit[j-]+);
push(s,val);
if(mp[i][j+])
push(s^(<<bit[j]+),val);
}
}else if(p+q==){
s^=(<<bit[j-])+(<<bit[j]);
push(s,val);
}
}
}
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%s",mp[i]+);
for(int i=;i<=;++i) bit[i]=i<<;
if(n<m) reversal();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(mp[i][j]=='_') mp[i][j]=,xx=i,yy=j;
else mp[i][j]=;
DP();
printf("%d\n",tot[c]?dp[c][]:);
}

【bzoj2331】[SCOI2011]地板的更多相关文章

  1. bzoj2331 [SCOI2011]地板

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

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

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

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

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

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

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

  5. bzoj:2331: [SCOI2011]地板

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

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

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

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

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

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

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

  9. P3272 [SCOI2011]地板

    \(\color{#0066ff}{ 题目描述 }\) lxhgww的小名叫"小L",这是因为他总是很喜欢L型的东西.小L家的客厅是一个R*C的矩形,现在他想用L型的地板来铺满整个 ...

随机推荐

  1. android DialogFragment 实现Dialog展示扫二维码图片展示

    近期开发项目,做个按钮点击弹出展示微信二维码关注微信公众号的展示框,于是想到DialogFragment,期间对Dialog的title的底框字体颜色做出相关设置,记录如下: 下面是 DialogFr ...

  2. 没人看系列-----html随笔

    <!DOCTYPE> 目录 没人看系列-----html/css详解 前言 不多说这段时间写了好多好多前端的东西,以至于自己重新返回看了一遍前端的所有技术.故此做个总结,准备学东西的请绕行 ...

  3. Windows 10创意者更新ISO发布!官方下载

    http://news.mydrivers.com/1/526/526719.htm 去年7月份,微软面向Windows 10推出了“周年更新”,让系统变得更加稳定好用.今天,Windows 10迎来 ...

  4. Android两级嵌套ListView滑动问题的解决

    Android下面两级嵌套ListView会出现滑动失效,解决方案,把两级Listview全换成NoScrollListView,代码如下: public class NoScrollListView ...

  5. 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

    一.关于T-SQL T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL. 二.逻辑查询处理各个阶段 2.1 逻辑查询处理流 ...

  6. [已解决]pycharm的debugger模式不显示调试结果?

    由于朋友遇到这个问题,特意上网搜索了很久,没有相关答案,后来自己尝试与能正常显示的做设置对比,才找到控制开关,在此做个记录,分享给遇到这个问题的朋友. 问题如下图: 解决办法: 左上角File--&g ...

  7. Robot framework(RF) Builti,Screenshot和Collections标准库介绍

    1.1  Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...

  8. 基于Kafka Connect框架DataPipeline在实时数据集成上做了哪些提升?

    在不断满足当前企业客户数据集成需求的同时,DataPipeline也基于Kafka Connect 框架做了很多非常重要的提升. 1. 系统架构层面. DataPipeline引入DataPipeli ...

  9. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

    此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer opera ...

  10. https://doc.opensuse.org/projects/kiwi/doc/

    KIWI 是用于创建操作系统映像的系统.映像是带有一个文件的目录,该文件包含操作系统.其应用程序与配置.操作系统的文件系统结构.可能的附加元数据,以及(取决于映像类型)磁盘几何属性和分区表数据.通过 ...