对插头DP的理解还不是很透彻。

先说一下肤浅的理解吧。

插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题。插头一般指每相邻2个网格的接口。

题目难度:一般不可做。

使用三进制状态,用0表示没有插头,1表示左括号插头,2表示右括号插头,而由于位运算常数特别小,可以采用四进制+手工hash的做法。处理好状态与编号的对应关系后进行dp,复杂度就只与合法状态数有关了,时间复杂度O(snm^2),其中s为合法状态数(不超过42000),而第二维的m显然也是不满的,因此可以通过本题。

然后递推就是大力讨论情况,详细见代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+,mod=;
int n,m,D,ex,ey,tot[],mp[][],pw[],hd[N],nxt[N],a[][N];
ll ans,f[][N];
char str[];
void add(int x,ll y)
{
int u=x%mod+;
for(int i=hd[u];i;i=nxt[i])if(a[D][i]==x){f[D][i]+=y;return;}
nxt[++tot[D]]=hd[u],hd[u]=tot[D];
a[D][tot[D]]=x,f[D][tot[D]]=y;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",str+);
for(int j=;j<=m;j++)
if(str[j]=='.'){mp[i][j]=,ex=i,ey=j;}
}
pw[]=;
for(int i=;i<=max(n,m);i++)pw[i]=pw[i-]*;
a[][]=,tot[]=f[][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=tot[D];j++)a[D][j]*=;
for(int j=;j<=m;j++)
{
memset(hd,,sizeof hd);
tot[D^=]=;
for(int k=;k<=tot[D^];k++)
{
int S=a[D^][k],b1=(S>>(j*-))%,b2=(S>>(j*))%;
ll p=f[D^][k];
if(!mp[i][j])
{
if(!b1&&!b2)add(S,p);
}
else if(!b1&&!b2)
{
if(mp[i+][j]&&mp[i][j+])add(S+pw[j-]+*pw[j],p);
}
else if(!b1&&b2)
{
if(mp[i][j+])add(S,p);
if(mp[i+][j])add(S-b2*pw[j]+b2*pw[j-],p);
}
else if(b1&&!b2)
{
if(mp[i+][j])add(S,p);
if(mp[i][j+])add(S-b1*pw[j-]+b1*pw[j],p);
}
else if(b1==b2)
{
if(b1==)
{
int tmp=;
for(int l=j+;l<=m;l++)
{
if((S>>(l*))%==)tmp++;
if((S>>(l*))%==)tmp--;
if(!tmp){add(S-pw[l]-pw[j-]-pw[j],p);break;}
}
}
if(b1==)
{
int tmp=;
for(int l=j-;l>=;l--)
{
if((S>>(l*))%==)tmp--;
if((S>>(l*))%==)tmp++;
if(!tmp){add(S+pw[l]-*pw[j-]-*pw[j],p);break;}
}
}
}
else if(b1==&&b2==)add(S-*pw[j-]-pw[j],p);
else if(i==ex&&j==ey)ans+=p;
}
}
}
printf("%lld",ans);
}

bzoj1814 Ural 1519 Formula 1(插头DP)的更多相关文章

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

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

  2. BZOJ1814: Ural 1519 Formula 1(插头Dp)

    Description Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic gam ...

  3. 【BZOJ1814】Ural 1519 Formula 1 插头DP

    [BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...

  4. bzoj 1814 Ural 1519 Formula 1 插头DP

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 942  Solved: 356[Submit][Sta ...

  5. bzoj 1814 Ural 1519 Formula 1 ——插头DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...

  6. Ural 1519 Formula 1 插头DP

    这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连 ...

  7. bzoj 1814: Ural 1519 Formula 1 插头dp经典题

    用的括号序列,听说比较快. 然并不会预处理,只会每回暴力找匹配的括号. #include<iostream> #include<cstdio> #include<cstr ...

  8. 插头DP讲解+[BZOJ1814]:Ural 1519 Formula 1(插头DP)

    1.什么是插头$DP$? 插头$DP$是$CDQ$大佬在$2008$年的论文中提出的,是基于状压$D$P的一种更高级的$DP$多用于处理联通问题(路径问题,简单回路问题,多回路问题,广义回路问题,生成 ...

  9. 【Ural】1519. Formula 1 插头DP

    [题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题 ...

随机推荐

  1. DevExtreme App 开发记要

        添加插件 除提供的标准插件外,可直接在config.xml中书写配置,然后编译模板,在后台能看到相关的插件了         无法显示百度地图 在IPHONE中正常加载地图,但在安卓中提示BM ...

  2. Eclipse导出包含第三方Jar的工程

    基于第三方开源的Jar包封装了一个工具类,在导出成Jar包后,引用新生成的Jar包,却报找不到类的错误.看了一下生成的Jar包,发现根本没有包含第三方Jar包的相关class.这是导出第三方Jar包时 ...

  3. 应用wavesurfer.js绘制音频波形图小白极速上手总结

    一.简介 1.1  引   人生中第一份工作公司有语音识别业务,需要做一个web网页来整合语音引擎的标注结果和错误率等参数,并提供人工比对的语音标注功能(功能类似于TranscriberAG等),(博 ...

  4. Linux 下的 python 虚拟环境 + vim快捷方式

    day04虚拟环境 https://www.cnblogs.com/pyyu/p/9015317.html 博客 关闭防火墙: systemctl stop firewalld # 关闭防火前 sys ...

  5. golang 实现HTTP代理和反向代理

    正向代理 package main import ( "fmt" "io" "net" "net/http" " ...

  6. gVim编辑器 模板篇

    上文介绍了gVim的常用操作,这次总结一下我自己常用的模板. 安装和配置好gVim后,在Program Files (x86)\Vim目录下有个“_vimrc”文件,双击选择gVim软件打开,在里面添 ...

  7. Nmon实时监控并生成HTML监控报告

    前面的博客介绍了服务端监控工具:Nmon使用方法,最近在github找到了一个nmon自动监控并生成HTML格式报告的工具:easyNmon,使用体验蛮不错的,这里介绍下它的安装及使用方法. 一.关于 ...

  8. 增强for

    什么是增强for? 增强for(也称之为for each)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的.他的内部原理其实是一个Iterator迭代器,所以在遍历过程中不能对集合 ...

  9. Xcode: Run Script 的运用, 使build打包后自动+1

    背景: 每次打包都要build+1处理,比较麻烦,使用 Run Script 的运用使build打包后自动+1 0. 使用xcode 添加run Script 然后就可以添加Run Script了 1 ...

  10. SVN和GIT

    一.SVN SVN使用起来还是比较简单的,我使用的SVN小乌龟版本是1.1的.(SVN已经可以正常使用了) 先说下自己了解的SVN流程吧,可能比较简单,不过这个也是实际的使用情况,忽略了很多其他功能( ...