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 [题解]<基于连通性状态压缩的动态规划问题 ...
随机推荐
- python之循环(增删)内使用list.remove()
dat=['] for item in dat: ': dat.remove(item) print(dat) #按要求是把'0'都删掉的,输出结果是['1', '2', '3', '0'] ?? 首 ...
- Python 经典面试题汇总之数据库篇
数据库和缓存 1.列举常见的关系型数据库和非关系型都有那些? 关系型数据库(需要有表结构) mysql.oracle.splserver.postgresql.db2.sybase 非关系型数据库(是 ...
- VS打开项目或解决方案卡死,一直处于未响应状态。
1.背景:接手公司新项目时,无论用vs2013还是用vs2017都打开不了 2.解决办法:先把.suo文件删掉, 结果:vs2013可以打开,vs2017依旧打不开. 3.继续解决:上网搜了一下,把隐 ...
- python学习笔记5_异常
python学习笔记5_异常 1.什么事异常 Python使用异常对象(exception object) 来表示异常情况.遇到错误会发生异常. 如果异常对象未被处理或被捕捉,程序就会用所谓的回溯(t ...
- nginx配置文件详细解读
https://m.w3cschool.cn/nginx/nginx-d1aw28wa.html ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户 ...
- Python函数默认参数的陷阱
默认参数实际上只有一个值 代码1 def func(l = 1): l += 1 print(l) func() func() func() 代码2 lst = [] def func(a,l = l ...
- 从jsp到java文件再返回到前台页面的过程
客户端请求jsp页面总共分为三个阶段: <%@ page language="java" contentType="text/html; charset=utf-8 ...
- LoRa---她的芯片和她的几种工作模式
LoRa对应的芯片------sx1278芯片 sx1278芯片为Semtech公司推出的具有新型LoRa扩频技术的RF芯片,具有功耗低.容量大.传输距离远.抗干扰能力强的优点.我接下来在这块芯片上进 ...
- 创建pandas和sqlalchemy的j交互对象,方便于日常的数据库的增删改查(原创)
#导入第三方库sqlalchemy的数据库引擎 from sqlalchemy import create_engine #导入科学计算库 import pandas as pd #导入绘图库 imp ...
- 我对DFS的理解
我对DFS的理解 [何为DFS] 深度优先搜索(Depth-First-Search),简称DFS.是一种常见搜索算法.其方法是从原点不断一条路扩散,当无路可走时回退来走下一条路,直至找到目标或遍历. ...