bzoj1814 Ural 1519 Formula 1(插头DP)
对插头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)的更多相关文章
- bzoj1814 Ural 1519 Formula 1(插头dp模板题)
1814: Ural 1519 Formula 1 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 924 Solved: 351[Submit][Sta ...
- BZOJ1814: Ural 1519 Formula 1(插头Dp)
Description Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic gam ...
- 【BZOJ1814】Ural 1519 Formula 1 插头DP
[BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...
- 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 ...
- bzoj 1814 Ural 1519 Formula 1 ——插头DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...
- Ural 1519 Formula 1 插头DP
这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连 ...
- bzoj 1814: Ural 1519 Formula 1 插头dp经典题
用的括号序列,听说比较快. 然并不会预处理,只会每回暴力找匹配的括号. #include<iostream> #include<cstdio> #include<cstr ...
- 插头DP讲解+[BZOJ1814]:Ural 1519 Formula 1(插头DP)
1.什么是插头$DP$? 插头$DP$是$CDQ$大佬在$2008$年的论文中提出的,是基于状压$D$P的一种更高级的$DP$多用于处理联通问题(路径问题,简单回路问题,多回路问题,广义回路问题,生成 ...
- 【Ural】1519. Formula 1 插头DP
[题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题 ...
随机推荐
- 关于获取URL中传值的解决方法--升级版
这次页面之间的传值是升级版本,为什么是升级版本呢,因为这次页面的传值不一样了.大家可以看一下我原来的文章<关于获取URL中传值的解决方法> 其实上次就已经比较清楚的介绍了页面之间的传值,但 ...
- Spring boot项目maven的profile多环境配置不自动替换变量的问题解决
Spring boot项目maven的profile多环境配置不自动替换变量的问题解决 在网上找了好久,配置都很简单,可是我的程序就是不能自动替换变量,最终单独测试,发现原来是引用spring b ...
- mysql很有用的语句
1)删除表内所有数据: 再添加数据时,如果设有自动增加的id,那么id也会重置. truncate table 表名; 2)创建结构相同的数据库表 create table 数据库名.新表名 like ...
- fastjson SerializerFeature详解
- python学习笔记3_抽象
这一步的学习四个知识点,如何将语句组织成函数,参数,作用域(scope),和递归 一.函数 1.抽象和结构 抽象可以节省很多的工作量,实际上它的作用更大,它是使得计算机程序让人读懂的关键(这也是最基本 ...
- Java 7 和 Java 8 中的 HashMap原理解析
HashMap 可能是面试的时候必问的题目了,面试官为什么都偏爱拿这个问应聘者?因为 HashMap 它的设计结构和原理比较有意思,它既可以考初学者对 Java 集合的了解又可以深度的发现应聘者的数据 ...
- Elastic Stack-Elasticsearch使用介绍(四)
一.前言 上一篇说了一下查询和存储机制,接下来我们主要来说一下排序.聚合.分页: 写完文章以后发现之前文章没有介绍Coordinating Node,这个地方补充说明下Coordinating ...
- 10-PI开发手册-ERP发布服务供外围系统调用(RFC类型)
一. 文档信息 版本号* 更新日期* 姓名* 更新内容及更新理由* 备注* V1.0 2019/02/19 fanjb 文档创建 以福利接口13589(Z00HRJ_GJJ_REV_FI ...
- 关于配置ssh免密码登录后,仍提示输入密码
一.在A端创建密钥对: [root@A ~] -P '' 二.如果B机器没有.ssh和authorized_keys文件则创建这个文件夹和文件先,创建后要chown改成当前用户的所属者,其次也要改: ...
- VisualStudio 快捷键
ctrl + o : 打开当前文件所在文件目录 ctrl + 鼠标左键 : 转到方法或者字段定义