【题目分析】

经典题目,插头DP。

switch 套 switch 代码瞬间清爽了。

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. #define F(i,j,k) for (int i=j;i<=k;++i)
  7. #define D(i,j,k) for (int i=j;i>=k;--i)
  8. #define maxn 400005
  9. const int md=20110520;
  10. int dp[2][maxn],a[101][101],n,m,fac[15],tot,b[15];
  11. char s[105];
  12. void print(int x){F(i,0,m) printf("%d",(x%fac[i+1])/fac[i]);}
  13. int main()
  14. {
  15. scanf("%d%d",&n,&m);
  16. F(i,0,n-1){scanf("%s",s);F(j,0,m-1)a[i][j]=s[j]=='*'?1:0;}
  17. if (m>n){F(i,0,m-1)F(j,i+1,m-1)swap(a[i][j],a[j][i]);swap(m,n);}
  18. // F(i,0,n-1){F(j,0,m-1)printf("%d ",a[i][j]);printf("\n");}
  19. fac[0]=1;F(i,1,13)fac[i]=fac[i-1]*3;tot=fac[m+1]-1;
  20. int now=1,pre=0;
  21. memset(dp[now],0,sizeof dp[now]);
  22. dp[now][0]=1;
  23. F(i,0,n-1) F(j,0,m-1)
  24. {
  25.  
  26. if (a[i][j])
  27. {
  28. now^=1;pre^=1;
  29. memset(dp[now],0,sizeof dp[now]);
  30. F(s,0,tot) if (dp[pre][s])
  31. {
  32. // printf("now is "); print(s); printf(" \n");
  33. int tmp1=(s%fac[j+1])/fac[j],tmp2=(s%fac[j+2])/fac[j+1],tmp=s;
  34. if (!tmp1&&!tmp2)
  35. {
  36. (dp[now][s]+=dp[pre][s])%=md;
  37. // printf(" to "); print(s); printf("\n");
  38. }
  39. }
  40. }
  41. else
  42. {
  43. now^=1;pre^=1;
  44. memset(dp[now],0,sizeof dp[now]);
  45. F(s,0,tot) if (dp[pre][s])
  46. {
  47. // printf("now is "); print(s); printf(" \n");
  48. int tmp1=(s%fac[j+1])/fac[j],tmp2=(s%fac[j+2])/fac[j+1],tmp=s;
  49. switch(tmp1)
  50. {
  51. case 0:
  52. switch(tmp2)
  53. {
  54. case 0:
  55. tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
  56. // printf(" to "); print(tmp+2*fac[j]+2*fac[j+1]); printf("\n");
  57. (dp[now][tmp+2*fac[j]+2*fac[j+1]]+=dp[pre][s])%=md;
  58. // printf(" to "); print(tmp+fac[j]); printf("\n");
  59. (dp[now][tmp+fac[j]]+=dp[pre][s])%=md;
  60. // printf(" to "); print(tmp+fac[j+1]); printf("\n");
  61. (dp[now][tmp+fac[j+1]]+=dp[pre][s])%=md;
  62. break;
  63. case 1:
  64. tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
  65. // printf(" to "); print(tmp+fac[j]); printf("\n");
  66. (dp[now][tmp+fac[j]]+=dp[pre][s])%=md;
  67. // printf(" to "); print(tmp+2*fac[j+1]); printf("\n");
  68. (dp[now][tmp+2*fac[j+1]]+=dp[pre][s])%=md;
  69. break;
  70. case 2:
  71. tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
  72. // printf(" to "); print(tmp); printf("\n");
  73. (dp[now][tmp]+=dp[pre][s])%=md;
  74. // printf(" to "); print(tmp+2*fac[j]); printf("\n");
  75. (dp[now][tmp+2*fac[j]]+=dp[pre][s])%=md;
  76. break;
  77. }
  78. break;
  79. case 1:
  80. switch(tmp2)
  81. {
  82. case 0:
  83. tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
  84. // printf(" to "); print(tmp+2*fac[j]); printf("\n");
  85. (dp[now][tmp+2*fac[j]]+=dp[pre][s])%=md;
  86. // printf(" to "); print(tmp+fac[j+1]); printf("\n");
  87. (dp[now][tmp+fac[j+1]]+=dp[pre][s])%=md;
  88. break;
  89. case 1:
  90. tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
  91. // printf(" to "); print(tmp); printf("\n");
  92. (dp[now][tmp]+=dp[pre][s])%=md;
  93. break;
  94. case 2:
  95. break;
  96. }
  97. break;
  98. case 2:
  99. switch(tmp2)
  100. {
  101. case 0:
  102. tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
  103. // printf(" to "); print(tmp+2*fac[j]); printf("\n");
  104. (dp[now][tmp+2*fac[j+1]]+=dp[pre][s])%=md;
  105. // printf(" to "); print(tmp); printf("\n");
  106. (dp[now][tmp]+=dp[pre][s])%=md;
  107. break;
  108. case 1:
  109. break;
  110. case 2:
  111. break;
  112. }
  113. break;
  114. }
  115. }
  116. }
  117. if (j==m-1)
  118. {
  119. // printf("On The last of road\n");
  120. now^=1;pre^=1;
  121. memset(dp[now],0,sizeof dp[now]);
  122. F(s,0,tot) if (dp[pre][s])
  123. {
  124. // printf("End with "); print(s);
  125. int tmp=s,tmp1=(s%fac[m+1])/fac[m];
  126. if (tmp1) {continue;}
  127. tmp*=3;
  128. // printf(" can become "); print(tmp); printf("\n");
  129. (dp[now][tmp]+=dp[pre][s])%=md;
  130. }
  131. }
  132. }
  133. printf("%d\n",dp[now][0]);
  134. }

  

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. UIView和Masonry实现动画效果

    Masonry 实现动画效果如下: //button点击方法 - (void)clickedButton { static BOOL isMove; //默认是NO Weakify(weakSelf) ...

  2. Git .gitignore 设置为全局global

    在操作Git时,我们会将修改的内容$git add . 到Git,Git会提示我们哪些文件都修改了.此时提示中会包括系统自动修改的文件,bin文件等.而我们add到Git时,并不希望将这些文件也一同a ...

  3. 利用UnblockNeteaseMusic实现网易云破版权,并实现shell可快速访问

    注:本篇包含mac及windows下安装方式详细 mac安装 前提:安装有node环境,可参考 mac下安装nodejs 安装 下载git代码到本地 git clone https://github. ...

  4. Windows定时任务管理以及服务管理

    1.NSSM.exe https://nssm.cc/ 2.Topshelf 引用地址:https://www.cnblogs.com/guogangj/p/10093102.html#4136330

  5. UVA 1151 Buy or Build (最小生成树)

    先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...

  6. couldn't be opened because you don't have permission to view it” 解决方法

    I use Xcode6 GM. I encountered the same problem. What I did was to go to Build Options. Then I chang ...

  7. 关于回顾css发现的一些问题

    1.针对于before和after伪元素的用法: <style> .clearfix:before, .clearfix:after{ clear:both; content:" ...

  8. 第2节 azkaban调度:17、azkaban的两个服务模式的安装

    2.3.3.azkaban两个服务模式安装 1.确认所需软件: Azkaban Web服务安装包 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz Azkaban执行服 ...

  9. go get 升级所有

    go get -u all go get -u go mod update go get -u full_package_name    go get -u github.com/... // ('. ...

  10. Hibernate映射文件配置(hbm.xml和注解方式)

    一:通过*.hbm.xml配置实体的实现方式 mappingResources用于指定少量的hibernate配置文件像这样 Xml代码  <property name="mappin ...