题目链接:

  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型砖的走向即可。

代码:

  

  1. #define Troy
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. const int mod=,
  8. N=2e5+;
  9.  
  10. int n,m,c,xx,yy,dp[][N],tot[],stk[][N],h[N],bit[],ans;
  11.  
  12. char mp[][];
  13.  
  14. inline void reversal(){
  15. char s[][];
  16. for(int i=;i<=n;++i)
  17. for(int j=;j<=m;++j)
  18. s[j][i]=mp[i][j];
  19. memcpy(mp,s,sizeof(mp));
  20. swap(n,m);
  21. }
  22.  
  23. inline void _plus(int &x,int y){
  24. x+=y;
  25. if(x>=mod) x-=mod;
  26. }
  27.  
  28. struct edges{
  29. int v;edges *last;
  30. }edge[N],*head[(int)4e4];int cnt;
  31.  
  32. inline void push(int s,int val){
  33. int pos=s%;
  34. for(edges *i=head[pos];i;i=i->last){
  35. if(stk[c][i->v]==s){
  36. (dp[c][i->v]+=val)%=mod;
  37. return ;
  38. }
  39. }
  40. // while(h[pos]!=-1){
  41. // if(stk[t][h[pos]]==s){
  42. // dp[t][h[pos]]+=val;
  43. // return ;
  44. // }
  45. // ++pos;
  46. // if(pos==N) pos=0;
  47. // }
  48. dp[c][++tot[c]]=val; stk[c][tot[c]]=s;
  49. edge[++cnt]=(edges){tot[c],head[pos]};head[pos]=edge+cnt;
  50. }
  51.  
  52. inline void DP(){
  53. dp[][]=,tot[]=;
  54. register int i,j,k;
  55. for(i=;i<=n;++i){
  56. for(j=;j<=tot[c];++j) stk[c][j]<<=;
  57. for(j=;j<=m;++j){
  58. c^=;tot[c]=;cnt=;
  59. memset(head,,sizeof(head));
  60. for(k=;k<=tot[c^];++k){
  61. int s=stk[c^][k],p=(s>>bit[j-])&,q=(s>>bit[j])&;
  62. int val=dp[c^][k];
  63. if(!mp[i][j]){
  64. if(!p&&!q) push(s,val);
  65. }else if(!p&&!q){
  66. int x;
  67. if(mp[i+][j]){
  68. x=s+(<<bit[j-]);
  69. push(x,val);
  70. }if(mp[i][j+]){
  71. x=s+(<<bit[j]);
  72. push(x,val);
  73. }if(mp[i+][j]&&mp[i][j+]){
  74. s+=(<<bit[j-])+(<<bit[j])<<;
  75. push(s,val);
  76. }
  77. }else if(!p){
  78. if(q==){
  79. if(mp[i+][j]){
  80. push(s^(<<bit[j-]^(<<bit[j])),val);
  81. }
  82. if(mp[i][j+]){
  83. push(s+(<<bit[j]),val);
  84. }
  85. }else{
  86. s^=q<<bit[j];
  87. push(s,val);
  88. if(mp[i+][j])
  89. push(s^(<<bit[j-]+),val);
  90. }
  91. }else if(!q){
  92. if(p==){
  93. if(mp[i][j+]){
  94. push(s^(<<bit[j-]^(<<bit[j])),val);
  95. }
  96. if(mp[i+][j]){
  97. push(s+(<<bit[j-]),val);
  98. }
  99. }else{
  100. s^=(<<bit[j-]+);
  101. push(s,val);
  102. if(mp[i][j+])
  103. push(s^(<<bit[j]+),val);
  104. }
  105. }else if(p+q==){
  106. s^=(<<bit[j-])+(<<bit[j]);
  107. push(s,val);
  108. }
  109. }
  110. }
  111. }
  112. }
  113.  
  114. int main(){
  115. scanf("%d%d",&n,&m);
  116. for(int i=;i<=n;++i) scanf("%s",mp[i]+);
  117. for(int i=;i<=;++i) bit[i]=i<<;
  118. if(n<m) reversal();
  119. for(int i=;i<=n;++i)
  120. for(int j=;j<=m;++j)
  121. if(mp[i][j]=='_') mp[i][j]=,xx=i,yy=j;
  122. else mp[i][j]=;
  123. DP();
  124. printf("%d\n",tot[c]?dp[c][]:);
  125. }

【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. 从Freelancer的热门Skill看看你应该学什么?

    以下数据是2012-1-31号数据. Websites, IT & Software: PHP (2402)HTML (1639)SEO(877)MySQL (836)Link Buildin ...

  2. element.dispatchEvent is not a function的解决

    Firebug中的出错提示: element.dispatchEvent is not a function element.dispatchEvent(event); prototype.js (第 ...

  3. Wooden Sticks -HZNU寒假集训

    Wooden Sticks There is a pile of n wooden sticks. The length and weight of each stick are known in a ...

  4. spring boot:thymeleaf使用详解

    简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在 ...

  5. Coursera-AndrewNg(吴恩达)机器学习笔记——第三周

    一.逻辑回归问题(分类问题) 生活中存在着许多分类问题,如判断邮件是否为垃圾邮件:判断肿瘤是恶性还是良性等.机器学习中逻辑回归便是解决分类问题的一种方法.二分类:通常表示为yϵ{0,1},0:&quo ...

  6. 用ASP.NET Core 2.0 建立规范的 REST API

    什么是REST REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络资源是如何定义和寻址的. ...

  7. Beta项目总结

    Beta冲刺成员名单和工作量比例 姓名 学号 负责内容 工作量比例 张梨贤 170327109 负责企业人员的委托/收回授权.第三方机构的委托授权管理.分级统计展示.分级列表展示 26% 黄腾飞 17 ...

  8. Django入门一之安装及项目创建

    1. 习惯性的创建虚拟环境 # 由于我安装也安装了pyhton3所以在前面要加python2 -m F:\Python Script\MyVirtualenv>python2 -m virtua ...

  9. 读《图解HTTP》有感-(与HTTP协作的WEB服务器)

    写在前面 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档: 一台web服务器可以搭建多个独立域名的web网站,也可以作为通信路径(路由)上的中 ...

  10. python3+requests:使用类封装接口测试脚本

    前言:接口测试用例较多,我们不可能每个用例都写一次requests,get或者requests,post等,所以对共用方法要进行封装处理 第一次修改:将get请求和post请求单独定义出来,使用过程中 ...