题目链接:

  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. 操作json数据

    删除: delete json[key] 把json字符串转成jsonObject : eval(+'('+json+')'+) 把jsonObject 转换成json字符串 :json.toJSON ...

  2. solr研磨之游标分页

    普通分页 当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000 x 10 页的数据,并将这100000条数据缓存在内存中,然后在内存中进行排序.最后返回最后10 ...

  3. 搭建spring cloud config

    很久没更新了,因为不是专职研究spring cloud,因此更新速度得看工作强度大不大,每天能抽出的时间不多,如果更新太慢了,并且有小伙伴看的话,请见谅了. Spring Cloud简介 Spring ...

  4. Mybatis与Ibatis比较

    随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis  虽然从正式版发布至今也有近一年时间,官方也非常友好的提供了中文版的使用手册,不过相信很多人还在项目中使用iba ...

  5. Razor视图

    @{ string name="jerry";} <div> @name </div>     //显示jerry @{ string js="& ...

  6. SpringMvc+AngularJS通过CORS实现跨域方案

    什么是跨域请求问题? 这个问题的起因在于现代浏览器默认都会基于安全原因而阻止跨域的ajax请求,这是现代浏览器中必备的功能,但是往往给开发带来不便. 但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿 ...

  7. rsync+innotify做到同步式更新

    innotify主要功能: 他是内核用于通知用户控件程序文件系统变化的机制. 也就是说,当服务器发生了任何的改动,内核都会知道并通知用户. rssync(做同步的)+innotify做到的就是实时的同 ...

  8. WSL Windows Subsystem for Linux安装指南

    见官方文档: https://msdn.microsoft.com/en-us/commandline/wsl/install_guide

  9. pg_restore数据库恢复指令

    pg_restore restores a PostgreSQL database from an archive created by pg_dump. Usage:  pg_restore [OP ...

  10. App免费推广途径概要

    说在前面的话:免费其实挺花功夫的,所有的营销的前提是产品和服务是值得推荐的. 1.技术操作维度:ASO,SEO, ASO简单介绍:http://baike.baidu.com/subview/1368 ...