用的括号序列,听说比较快。

  然并不会预处理,只会每回暴力找匹配的括号。

  

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 199917
#define ll long long
#define bp 1<<bit[j-1]
#define bq 1<<bit[j]
using namespace std;
int n,m;
int map[][];
int head[],num,ver[N],nxt[N],tot[],hash[][N];
ll f[][N];
int now,pre;
int bit[];
int edx,edy;
bool ed(int x,int y)
{
return x==edx&&y==edy;
}
void add(int s,ll d)
{
int a=s%;
for(int i=head[a];i;i=nxt[i])
{
if(hash[now][ver[i]]==s)
{
f[now][ver[i]]+=d;
return ;
}
}
tot[now]++;hash[now][tot[now]]=s;
f[now][tot[now]]=d;
num++;nxt[num]=head[a];head[a]=num;ver[num]=tot[now];
return ;
} int main()
{
for(int i=;i<=;i++)bit[i]=*i;
scanf("%d%d",&n,&m);
char s[];
for(int i=;i<=n;i++)
{
scanf("%s",s);
for(int j=;j<=m;j++)
{
if(s[j-]=='*')map[i][j]=;
else map[i][j]=;
}
}
bool flag=;
for(int i=n;i>=;i--)
{
for(int j=m;j>=;j--)
{
if(map[i][j])
{
edx=i,edy=j;break;
}
}
if(edx)break;
}
now=;pre=;
f[now][]=;tot[now]=;hash[now][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=tot[now];j++)hash[now][j]<<=;
for(int j=;j<=m;j++)
{
now^=;pre^=;
memset(head,,sizeof(head));
memset(f[now],,sizeof(f[now]));
tot[now]=;num=;
for(int k=;k<=tot[pre];k++)
{
int s=hash[pre][k];ll d=f[pre][k];
if(!d)continue;
int p=(s/(bp))&,q=(s/(bq))&;
if(!map[i][j])
{
if(!p&&!q)add(s,d);
}
else if(!p&&!q)
{
if(j<m)add(s^(bp)^(bq+),d);
}
else if(!p)
{
if(q==)
{
add(s^(bq)^(bp),d);
if(j<m)add(s,d);
}
else
{
add(s^(bq+)^(bp+),d);
if(j<m)add(s,d);
}
}
else if(!q)
{
if(p==)
{
if(j<m)add(s^(bp)^(bq),d);
add(s,d);
}
else
{
if(j<m)add(s^(bq+)^(bp+),d);
add(s,d);
}
}
else if(p==)
{
if(q==)add(s^(bp+)^(bq),d);
else
{
int dd=;
for(int l=j-;l>=;l--)
{
if(((s>>bit[l])&)==)dd++;
else if(((s>>bit[l])&)==)dd--;
if(!dd)
{
add((s^(bp+)^(bq+))-(<<bit[l])+(<<bit[l]+),d);
break;
}
}
}
}
else if(p==)
{
if(q==)
{
if(ed(i,j))add(s^(bp)^(bq+),d);
}
else
{
int ss=s>>bit[j+],dd=;
for(int l=j+;l<=m;l++,ss>>=)
{
if((ss&)==)dd++;
else if((ss&)==)dd--;
if(!dd)
{
add((s^(bp)^(bq))-(<<bit[l]+)+(<<bit[l]),d);
break;
}
}
}
}
}
}
}
ll ans=;
for(int i=;i<=tot[now];i++)
{
if(hash[now][ver[i]]==)ans=f[now][ver[i]];
}
printf("%lld\n",ans);
return ;
}

bzoj 1814: Ural 1519 Formula 1 插头dp经典题的更多相关文章

  1. 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 ...

  2. bzoj 1814 Ural 1519 Formula 1 ——插头DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...

  3. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  4. 【BZOJ1814】Ural 1519 Formula 1 插头DP

    [BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...

  5. Ural 1519 Formula 1 插头DP

    这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连 ...

  6. bzoj 1814: Ural 1519 Formula 1【插头dp】

    设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把 ...

  7. BZOJ1814: Ural 1519 Formula 1(插头Dp)

    Description Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic gam ...

  8. 【Ural】1519. Formula 1 插头DP

    [题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题 ...

  9. 【BZOJ1814】Ural 1519 Formula 1 (插头dp)

    [BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...

随机推荐

  1. thymeleaf 使用javascript定义数组报错

    js中免不了的要用的数组,一维的二维的三维的 但是当用到thymeleaf作为模版时候会有一些坑,导致数组不能用 org.thymeleaf.exceptions.TemplateProcessing ...

  2. AlexNet论文翻译-ImageNet Classification with Deep Convolutional Neural Networks

    ImageNet Classification with Deep Convolutional Neural Networks 深度卷积神经网络的ImageNet分类 Alex Krizhevsky ...

  3. Python发送邮件(最全)

    简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件. Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听 ...

  4. JQuery ajax请求struts action实现异步刷新的小实例

    这个样例是用JQuery ajax和struts来做的一个小样例,在这个样例中采用两种方式将java Util中的list转换成支json的格式,第一种是用json-lib.jar这个jar包来转换, ...

  5. webpack入门指南-step03

    一.webpack 的使用 webpack简单点来说就就是一个配置文件,所有的魔力都是在这一个文件中发生的. 这个配置文件主要分为三大块 entry 入口文件 让webpack用哪个文件作为项目的入口 ...

  6. Beta阶段中间产物【欢迎来怼】

    一.版本控制 ①Git地址:https://git.coding.net/tianjiping/Android-tianjiping.git ②check in次数:7次. ③成员代码贡献 因为阚博文 ...

  7. web07-jdbcBookStore

    新建web项目,名字 新建servlet,名字CreateDBServlet 内容为: ---- 配置web.xml 数据库的URL.driveclass.user.passWord都写在web.xm ...

  8. 对Largest函数的测试

    题目:查找list[]中的最大值:int Largest(int list[], int length); int Largest(int list[], int length) { int i,ma ...

  9. Task 6.2冲刺会议四 /2015-5-17

    今天主要是学习并熟悉了C#的开发流程,把他的文件的大体结构和每个组件之间的联系弄清楚之后.开始写服务器部分的内容.学习过程中,感觉网上的资料有些太鱼龙混杂了,不知道该怎么取舍.明天准备完善服务器的功能 ...

  10. java-switch语句

    switch语句是常用的java循环判断语句,但是有的知识点并不一定清楚. 首先是switch语句括号中的判断条件,判断条件只能是整型或者字符和整型或者字符组成的表达式. 再就是case语句,可以称之 ...