【BZOJ1814】Ural 1519 Formula 1 插头DP
【BZOJ1814】Ural 1519 Formula 1
题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数。(n,m<=12)
题解:插头DP板子题,刷板子,附带题解链接。
如何存放状态呢?可以采用hash,我们的hash表形如一个队列,每次新加入一个状态时,就沿着这个状态在队列中对应的hash值不断向后找,直到找到这个状态或者发现一个空位为止。
本题我的状态采用了4进制表示。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int limit=99991;
int n,m,k,tot[2],nn,mm;
bool v[20][20];
char str[20];
ll tag,ans;
int hs[limit],state[2][limit];
ll dp[2][limit];
inline void upd(ll S)
{
register int pos=S%limit;
while(hs[pos])
{
if(state[k][hs[pos]]==S)
{
dp[k][hs[pos]]+=tag;
return ;
}
pos++;
if(pos==limit) pos=0;
}
hs[pos]=++tot[k],state[k][tot[k]]=S,dp[k][tot[k]]=tag;
}
int main()
{
register int i,j,t,u,tmp,p,q,x,y,S,T;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%s",str+1);
for(j=1;j<=m;j++)asdasd
{
v[i][j]=str[j]=='.';
if(v[i][j]) nn=i,mm=j;
}
}
tot[0]=1,state[0][1]=0,dp[0][1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
k^=1;
memset(hs,0,sizeof(hs));
memset(state[k],0,sizeof(state[k][0])*(tot[k]+1));
memset(dp[k],0,sizeof(dp[k][0])*(tot[k]+1));
tot[k]=0;
for(t=1;t<=tot[k^1];t++)
{
S=state[k^1][t],tag=dp[k^1][t],y=j<<1,x=y-2,p=(S>>x)&3,q=(S>>y)&3,T=S^(p<<x)^(q<<y);
if(!v[i][j])
{
if(!p&&!q) upd(T);
continue;
}
if(p==0&&q==0&&v[i][j+1]&&v[i+1][j])
{
upd(T|(1<<x)|(2<<y));
continue;
}
if((p==0&&q==1)||(p==1&&q==0))
{
if(v[i+1][j]) upd(T|(1<<x));
if(v[i][j+1]) upd(T|(1<<y));
continue;
}
if((p==0&&q==2)||(p==2&&q==0))
{
if(v[i+1][j]) upd(T|(2<<x));
if(v[i][j+1]) upd(T|(2<<y));
continue;
}
if(p==2&&q==1)
{
upd(T);
continue;
}
if(p==1&&q==2&&i==nn&&j==mm)
{
ans+=tag;
continue;
}
if(p==1&&q==1)
{
for(tmp=0,u=y+2;u<=m+m&&tmp>=0;tmp+=((T>>u)&1)-((T>>(u+1))&1),u+=2);
u-=2,upd(T^(3<<u));
continue;
}
if(p==2&&q==2)
{
for(tmp=0,u=x-2;u>=0&&tmp>=0;tmp+=((T>>(u+1))&1)-((T>>u)&1),u-=2);
u+=2,upd(T^(3<<u));
continue;
}
}
}
for(t=1;t<=tot[k];t++) state[k][t]<<=2;
}
printf("%lld",ans);
return 0;
}
【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 ...
- 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 ...
- bzoj1814 Ural 1519 Formula 1(插头DP)
对插头DP的理解还不是很透彻. 先说一下肤浅的理解吧. 插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题.插头一般指每相邻2个网格的接口. 题目难度:一般不可做. 使用 ...
- 插头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 [题解]<基于连通性状态压缩的动态规划问题 ...
随机推荐
- 软件设计模式之代理模式(JAVA)
貌似停笔了近半个月了,实在不该啊,新的一年,时刻让自己归零. Back To Zero,就从这篇文章拉开今年的序幕吧. 这篇文章准备介绍下有关代理模式的基本概念和静态代理.动态代理的优缺点及使用方法( ...
- 4 云计算系列之Openstack简介与keystone安装
preface KVM 是openstack虚拟化的基础, 再介绍了kvm虚拟化技术之后,我们介绍下openstack和如何搭建. Openstack组件 openstack架构图如下所示 那么我们就 ...
- 详解CorelDRAW中关于群组的操作
CorelDRAW软件中的“群组”功能键主要用于整合多个对象.在进行比较复杂的绘图编辑时,通常会有很多的图形对象,为了方便操作,可以对一些对象设定群组.设定群组以后的多个对象,将被看作一个单独的对象. ...
- CentOS6.8手动安装MySQL5.6
众所周知,mysql5.7推出后有很多没有填好的坑,对于老的系统和项目兼容性也存在问题,所以现在普遍的web项目还是应该跑在centos6.8+mysql5.6的环境之下,今天主要说一下mysql5. ...
- Oauth2.0(二):开放平台
上一节说到Oauth2.0 的交互模型.模型涉及到三方:资源拥有者.客户端.服务提供方.其中,服务提供方包含两个角色:鉴权服务器和资源服务器.鉴权服务器负责对用户进行认证,并授权给客户端权限.认证这一 ...
- C#------如何深度克隆一个对象
普通版: public static object CloneObject( object obj ) { using ( MemoryStream memStream = new MemoryStr ...
- VSCode------搭建.net core 2.0,并配置到IIS服务器
前奏 安装VSCode最新版: https://code.visualstudio.com/ 安装window server hosting,发布和部署到IIS使用: https://www.micr ...
- linux_开发软件安装=命令步骤
1.Linux 操作系统软件安装以及redis 学习 JDK ----- Java开发运行环境 Tomcat -- WEB程序的服务器 MySQL --- 持久化存储数据 Re ...
- Java -- 异常的捕获及处理 -- 范例 -- throw与throws的应用
7.2.3 范例 -- throw与throws的应用 例:综合应用 Class : Math package limeThrowable._7_2_3; public class Math { pu ...
- 利用shell脚本自动获取awr报表
观察Oracle数据库性能,oracle自带的awr功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.通过报告可以了解一个系统的整个运行情况,生成的报告包括多个 ...