对插头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. java的设计模式 - 单例模式

    java 面试中单例模式基本都是必考的,都有最推荐的方式,也不知道问来干嘛.下面记录一下 饿汉式(也不知道为何叫这个名字) public class Singleton { private stati ...

  2. SpringBoot JPA(实现查询多值)

    JPA是java Persistence API简称,中文名:java持久层API,JPA是JCP组织发布的J2EE标准之一 1.创建DataSource连接池对象 <dependency> ...

  3. Dynamics 365-OnPremise V9 安装系统要求

    Dynamics 365 V9 OnPremise发布之后,博主率真地直接下载安装,首先就遇到了操作系统不支持的问题,但是通过CRM安装报错提示,发现给的链接参考信息也不对. document的链接调 ...

  4. TCP点对点转发的实现与原理(nodejs)

    Nagent Nagent是TCP点对点转发实现,名称来源于Nat与Agent的组合.类似frp项目,可以在局域网与互联网提供桥梁. 前提是你要有一台流量服务器并且有一个公网IP.如果没有,也可以找服 ...

  5. APICloud Studio2新建应用报错和检出错误

    今天心血来潮,闲暇时间想做个移动应用app,听一哥们说APICloud开发app很方便,就查询了一下,看了之后简直就是热血沸腾,我感觉正是我一直要找的工具 信心满满的开始着手使用,看了一下介绍我选择了 ...

  6. C# 匿名对象(匿名类型)、var、动态类型 dynamic——实用之:过滤类属性、字段实用dynamic

    例子 返回一个LIst<oject>类型 而oject含有 30个字段 而我只需要两个字段.这里实用dynamic 和 linq. 上代码: 注意select new {} 为匿名类型,这 ...

  7. hbase 过滤器 rowfilter

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...

  8. C# 内插字符串与字符串复合格式

    var name = "Tom"; ; string aa = string.Format("name:{0},age:{1}", name, age);//字 ...

  9. .net c#将数据库数据对象转换为实体值对象

    using System; using System.Data; namespace Sunlib { public static class DataHelper { //将数据库数据对象转换为实体 ...

  10. Ajax获取Response头信息

    $.ajax({ type: 'HEAD', // 获取头信息,type=HEAD即可 url : window.location.href, complete: function( xhr,data ...