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 [题解]<基于连通性状态压缩的动态规划问题 ...
随机推荐
- Flask实战第3天:url_for使用
我们之前是通过url来找到对应的视图函数 / => hello_world 那么url_for则是通过视图函数找到url hello world => / 演示如下 #c ...
- python xlrd 读取excel.md
文章链接:https://mp.weixin.qq.com/s/fojkVO-AB2cCu7FtDtPBjw 之前的文章介绍过关于写入excel表格的方法,近期自己在做一个网站,涉及到读取excel, ...
- Jmeter使用JDBC请求简介
1.现在oracle或mysql的jdbc然后放到jmeter的lib路径下 2.添加jdbc默认请求控件. 3.添加jdbc请求 4.发送 5.出现ORA-00911错误是由于sql语句错误,注意别 ...
- HTML语义化的理解
语义化的主要目的:用正确的标签做正确的事情. 语义化验证方法:css裸奔--去掉css样式,然后看页面是否还具有很好的可读性. 语义化意义 / 优点: 1.让页面的内容结构化 2.利于浏览器解析和SE ...
- C语言字符数组回顾
赋值篇: Part1 错误引例*2: char c6[];//WRONG c6="HELLO";//WRONG char c7[];//WRONG c7[]='H';// ...
- 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改
Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...
- LeetCode算法题-Self Dividing Numbers(Java实现)
这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...
- MYSQL内置MYSQL数据库中你可以得到的信息
1:help_topic 可以查看函数帮助,例如:SELECT * from help_topic WHERE name='concat' 可以查看concat函数. 2:SLOW_LOG 慢查询日 ...
- Visual Studio 2019 使用 Live Share
一.前言 Visual Studio 2019 在今天发布(北京时间)了,这次带来了一个比较有趣的 Live Share 功能,使用它可以进行更好的协作开发.主要功能: 更多资料可看官方介绍: Vis ...
- Python--day10(函数(使用、分类、返回值))
1. 函数 1. 函数: 完成特定功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表这函数 现实中:很多问题要通过一些工具进行处理 => 可以将工具提前生产出来并命名 =>通 ...