【题目分析】

经典题目,插头DP。

switch 套 switch 代码瞬间清爽了。

【代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define maxn 400005
const int md=20110520;
int dp[2][maxn],a[101][101],n,m,fac[15],tot,b[15];
char s[105];
void print(int x){F(i,0,m) printf("%d",(x%fac[i+1])/fac[i]);}
int main()
{
scanf("%d%d",&n,&m);
F(i,0,n-1){scanf("%s",s);F(j,0,m-1)a[i][j]=s[j]=='*'?1:0;}
if (m>n){F(i,0,m-1)F(j,i+1,m-1)swap(a[i][j],a[j][i]);swap(m,n);}
// F(i,0,n-1){F(j,0,m-1)printf("%d ",a[i][j]);printf("\n");}
fac[0]=1;F(i,1,13)fac[i]=fac[i-1]*3;tot=fac[m+1]-1;
int now=1,pre=0;
memset(dp[now],0,sizeof dp[now]);
dp[now][0]=1;
F(i,0,n-1) F(j,0,m-1)
{ if (a[i][j])
{
now^=1;pre^=1;
memset(dp[now],0,sizeof dp[now]);
F(s,0,tot) if (dp[pre][s])
{
// printf("now is "); print(s); printf(" \n");
int tmp1=(s%fac[j+1])/fac[j],tmp2=(s%fac[j+2])/fac[j+1],tmp=s;
if (!tmp1&&!tmp2)
{
(dp[now][s]+=dp[pre][s])%=md;
// printf(" to "); print(s); printf("\n");
}
}
}
else
{
now^=1;pre^=1;
memset(dp[now],0,sizeof dp[now]);
F(s,0,tot) if (dp[pre][s])
{
// printf("now is "); print(s); printf(" \n");
int tmp1=(s%fac[j+1])/fac[j],tmp2=(s%fac[j+2])/fac[j+1],tmp=s;
switch(tmp1)
{
case 0:
switch(tmp2)
{
case 0:
tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
// printf(" to "); print(tmp+2*fac[j]+2*fac[j+1]); printf("\n");
(dp[now][tmp+2*fac[j]+2*fac[j+1]]+=dp[pre][s])%=md;
// printf(" to "); print(tmp+fac[j]); printf("\n");
(dp[now][tmp+fac[j]]+=dp[pre][s])%=md;
// printf(" to "); print(tmp+fac[j+1]); printf("\n");
(dp[now][tmp+fac[j+1]]+=dp[pre][s])%=md;
break;
case 1:
tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
// printf(" to "); print(tmp+fac[j]); printf("\n");
(dp[now][tmp+fac[j]]+=dp[pre][s])%=md;
// printf(" to "); print(tmp+2*fac[j+1]); printf("\n");
(dp[now][tmp+2*fac[j+1]]+=dp[pre][s])%=md;
break;
case 2:
tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
// printf(" to "); print(tmp); printf("\n");
(dp[now][tmp]+=dp[pre][s])%=md;
// printf(" to "); print(tmp+2*fac[j]); printf("\n");
(dp[now][tmp+2*fac[j]]+=dp[pre][s])%=md;
break;
}
break;
case 1:
switch(tmp2)
{
case 0:
tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
// printf(" to "); print(tmp+2*fac[j]); printf("\n");
(dp[now][tmp+2*fac[j]]+=dp[pre][s])%=md;
// printf(" to "); print(tmp+fac[j+1]); printf("\n");
(dp[now][tmp+fac[j+1]]+=dp[pre][s])%=md;
break;
case 1:
tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
// printf(" to "); print(tmp); printf("\n");
(dp[now][tmp]+=dp[pre][s])%=md;
break;
case 2:
break;
}
break;
case 2:
switch(tmp2)
{
case 0:
tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
// printf(" to "); print(tmp+2*fac[j]); printf("\n");
(dp[now][tmp+2*fac[j+1]]+=dp[pre][s])%=md;
// printf(" to "); print(tmp); printf("\n");
(dp[now][tmp]+=dp[pre][s])%=md;
break;
case 1:
break;
case 2:
break;
}
break;
}
}
}
if (j==m-1)
{
// printf("On The last of road\n");
now^=1;pre^=1;
memset(dp[now],0,sizeof dp[now]);
F(s,0,tot) if (dp[pre][s])
{
// printf("End with "); print(s);
int tmp=s,tmp1=(s%fac[m+1])/fac[m];
if (tmp1) {continue;}
tmp*=3;
// printf(" can become "); print(tmp); printf("\n");
(dp[now][tmp]+=dp[pre][s])%=md;
}
}
}
printf("%d\n",dp[now][0]);
}

  

BZOJ 2331 [SCOI2011]地板 ——插头DP的更多相关文章

  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]地板 插头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. imageview加载本地和网络图片

    ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上. 在UI xml定义一个ImageView如下: public void onCreate(Bundle savedI ...

  2. Spark-水库抽样-根据抽样率确定每个分区的样本大小

    /* * 输入:采样率,待采样的RDD * 输出:每个分区的样本大小(记录数) * 由采样率确定,每个分区的样本大小 */ def findNumPerPartition[T: ClassTag, U ...

  3. codevs 1008 选数

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n ...

  4. vertx从入门到精通

    1.Vert.x安装指南 http://blog.csdn.net/sdyy321/article/details/38926005 http://blog.csdn.net/chszs/articl ...

  5. 融云参加RTC实时互联网大会 现场集成IM SDK

    9月21至22日,由全球实时云服务商声网Agora.io主办的RTC2017实时互联网大会在北京万豪酒店成功举办.作为亚洲最权威的RTC实时通信行业技术盛会,会议吸引了来自全球上千名开发者参加,Goo ...

  6. Words Prefixed Trans-

    transit v. Pass across or through (an area) The new large ships will be too big to transit the Panam ...

  7. Educational Codeforces Round 12补题 经典题 再次爆零

    发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...

  8. 【求助】NdisSend,自定义数据包发送失败?

    做ndis hook的时候,自定义了一个数据包,包结构应该没有问题,填充NDIS_PACKET结构是这样的,先初始化:        NdisAllocatePacketPool(&nStat ...

  9. 学习笔记(_huaji_)

    假如我没有见过太阳,我也许会忍受黑暗. 如果我知道自己会在哪里死去,我就永远都不去那儿.失败的经历,其实也有它的价值. 人的过失会带来错误,但要制造真正的灾难还得用计算机. 嘴角微微上扬已不复当年轻狂 ...

  10. 【技巧:字符串同构】Avendesora

    判断字符串“同构”的技巧 题目大意 给定A,B两个序列,要求B在A中出现的次数以及位置.定义字符变换:把所有相同的字符变为另一种字符:两个字符串相等:当且仅当一个字符串可以在若干次字符变换之后变为另一 ...