题目链接:

  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. Oracle 报错ORA-00904:标示符无效

    写select查询,报错:ORA-00904 标示符无效 这个错误通常是因为 字段名写错了,或者是在创建表的时候,创建最后一个字段的时候也加了逗号 . 我遇到的情况时,之前的同事创建表的时候,将小写的 ...

  2. 全面解读Java NIO工作原理(2)

    全面解读Java NIO工作原理(2) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...

  3. 视频压缩:I帧、P帧、B帧

    /*************************************************************************************************** ...

  4. Android Studio 插件开发详解一:入门练手

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 一:概述 相信大家在使用Android S ...

  5. C#避免踩坑之如何添加paint事件

    看截图: 首先,右击->属性 然后出来这个界面. 接下来,注意看这个界面的上面:鼠标悬停这个闪电符号,看到没,事件!! 那个闪电符号,点它! 然后下拉找到这个: 你要事先在代码里面添加Form1 ...

  6. Django模型层之字段查询参数及聚合函数

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 字段查询是指如何指定SQL WHERE子句的 ...

  7. 【转】IE浏览器快捷键大全

    一般快捷键F11打开/关闭全屏模式 TAB循环的选择地址栏,刷新键和当前标签页 CTRL+F在当前标签页查询字或短语 CTRL+N为当前标签页打开一个新窗口 CTRL+P打印当前标签页 CTRL+A选 ...

  8. Linux之SSH密钥认证

    1.SSH协议的认识 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前 ...

  9. 语音识别中的CTC算法的基本原理解释

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者:罗冬日 目前主流的语音识别都大致分为特征提取,声学模型,语音模型几个部分.目前结合神经网络的端到端的声学模型训练方法主要CTC和基 ...

  10. 浮点型 float和double类型的内存结构和精度问题

    首先引用一个例子在java中可能你会遇到这样的问题: 例:0.99999999f==1f //true 0.9999999f==1f //false 这是超出精度造成的,为了知道为什么会造成这样的问题 ...