正题

题目链接:https://www.luogu.com.cn/problem/P5056


题目大意

n∗mn*mn∗m的网格,求有多少条回路可以铺满整个棋盘。


解题思路

插头dpdpdp的,写法是按照题解上的写法。

状态用的是括号匹配,然后用了哈希+邻接表(挂表)还有滚动数组优化空间

然后可以看题解学


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int P=133331;
struct node{int to,next;
}a[P*2];
int n,m,o,tot,zx,zy,t[2],bit[25],ls[P],S[2][P],v[25][25];
long long ans,dp[2][P];
char st[25];
void Add(int s,long long v){int x=s%P;for(int i=ls[x];i;i=a[i].next)if(S[o][a[i].to]==s){dp[o][a[i].to]+=v;return;}t[o]++;dp[o][t[o]]=v;S[o][t[o]]=s;a[++tot].to=t[o];a[tot].next=ls[x];ls[x]=tot;return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",st+1);for(int j=1;j<=m;j++)if(st[j]=='.'){v[i][j]=1;zx=i;zy=j;}}for(int i=0;i<=12;i++)bit[i]=(1<<(i<<1));t[o]=1;S[o][1]=0;dp[o][1]=1;for(int i=1;i<=n;i++){for(int j=1;j<=t[o];j++)S[o][j]<<=2;//将右插头移到最左边 for(int j=1;j<=m;j++){o^=1;tot=t[o]=0;memset(ls,0,sizeof(ls));int s,dpl,rpl;long long w;for(int k=1;k<=t[!o];k++){s=S[!o][k];w=dp[!o][k];dpl=(s>>(j<<1))%4;rpl=(s>>(j-1<<1))%4;if(!v[i][j]){//障碍 if(!dpl && !rpl)Add(s,w);//不能有插头 }else if(!dpl && !rpl){//两边都没有插头if(v[i+1][j]&&v[i][j+1])//开一个左上角插头 Add(s+2*bit[j]+bit[j-1],w);} else if(!dpl && rpl){//只有右插头 if(v[i+1][j])Add(s,w);if(v[i][j+1])Add(s-rpl*bit[j-1]+rpl*bit[j],w);}else if(dpl && !rpl){//只有下插头if(v[i+1][j])Add(s-dpl*bit[j]+dpl*bit[j-1],w);if(v[i][j+1])Add(s,w); }else if(dpl==1&&rpl==1){int c=1;for(int p=j+1;p<=m;p++){if((s>>(p<<1))%4==1)c++;if((s>>(p<<1))%4==2)c--;if(!c){Add(s-bit[j]-bit[j-1]-bit[p],w);break;}}}else if(dpl==2&&rpl==2){int c=1;for(int p=j-2;p>=0;p--){if((s>>(p<<1))%4==2)c++;if((s>>(p<<1))%4==1)c--;if(!c){Add(s-2*bit[j]-2*bit[j-1]+bit[p],w);break;}}}else if(dpl==1&&rpl==2)Add(s-2*bit[j-1]-bit[j],w);else if(dpl==2&&rpl==1)if(i==zx&&j==zy)ans+=w;}}}printf("%lld\n",ans);return 0;
}

P5056-[模板]插头dp相关推荐

  1. 【luogu P5056】【模板】插头dp(插头DP)(分类讨论)

    [模板]插头dp 题目链接:luogu P5056 题目大意 有一个 n*m 的网格,每个格子要么必须铺线,要么必须不铺. 然后问你有多少个铺发使得形成一个闭合回路. 思路 快乐插头 DP 模板题. ...

  2. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 924  Solved: 351 [Submit][S ...

  3. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  4. NEFU 155 超弦(插头DP)

    超弦 Time Limit 5000ms Memory Limit 65536K description 前阵子hh看了一系列科普片<<优雅的宇宙>>,惊讶的发现整个世界都是由 ...

  5. 好学易懂 从零开始的插头DP(三)

    好学易懂 从零开始的插头DP(三) 写在前面 这篇文章主要是介绍一些括号表示法和简单回路的基本变化,下一篇会是一些非回路(最小表示),毒瘤状态(正wa着所以咕着),结合矩阵乘法加速等一些复杂应用.下下 ...

  6. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识--这真的是一种很锻炼人的题型-- 每一道题的状态都不一样 ...

  7. HDU4084 插头dp

    题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法 思路:插头DP或轮廓线,多加一维DP讨论就可以 注意插头DP状 ...

  8. POJ3133(插头dp)

    传送门:http://poj.org/problem?id=3133 Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K       ...

  9. P3272 [SCOI2011]地板(插头DP)

    [题面链接] https://www.luogu.org/problemnew/show/P3272 [题目描述] 有一个矩阵,有些点必须放,有些点不能放,用一些L型的图形放满,求方案数 [题解] ( ...

  10. POJ 3133 Manhattan Wiring (插头DP)

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1110   Accepted: 634 D ...

最新文章

  1. 列名无效怎么解决_电脑win键失效怎么办? 键盘win键无效的解决办法
  2. python程序打包多个py文件_不使用setup.py,打包 Python 项目
  3. LVDS DP等显示器接口简介
  4. JDK 8功能的可疑方面
  5. 获取该字符串第N次出现的位置
  6. java模型给泛型_【一天一个基础系列】- java之泛型篇
  7. python--文件
  8. epoll示例程序——服务端
  9. .NET的可调信号量
  10. mysql 双主 脑裂_MySQL双主(主主)架构方案
  11. 数字信号处理--7.5--FIR数字滤波器
  12. 拓端tecdat|SAS,R和Python应对数据管理和分析挑战
  13. 安装谷歌浏览器特定版本后禁止自动更新
  14. java里面获取map的key和value的方法
  15. Linux 安装Kerberos认证KDC服务
  16. 可视对讲系统服务器连接失败,可视对讲系统呼叫分机、门口机不通是什么问题?...
  17. java springboot 32位的UUID
  18. 真实版的“北京爱情故事”
  19. linux查看文件系统是否是只读,Linux 文件系统只读问题分析指引
  20. iOS完整App资源收集

热门文章

  1. hbase shell 查看列名_hbase shell 常用命令
  2. python input函数无法输入字符串_Python手把手教程之用户输入input函数
  3. 中求和符号上下标_涨电脑知识:如何在word中编写复杂的公式,写论文必备技能...
  4. bigint在java中用什么表示_为什么说开车最能看出一个人的人品和情商?这几条说的太精辟了...
  5. c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?
  6. .md是什么文件_Element-UI源码阅读之md显示到页面
  7. 中南民族大学c语言报告,中南民族大学信C语言实验报告.doc
  8. JAVA world转图片,将Kinect深度图像转换为真实世界坐标
  9. 乐高创意机器人moc_乐高MOC佳作欣赏丨机械之美机器人乐高作品集1
  10. ibm台式计算机不能自动关机,IBM X3650 M3 不定时自动关机求大神