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

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

  

 #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. dom学习要点

    Dom操作 1.文本内容操作 - innerText:操作文本 - innerHtml:操作全内容 //innerText标签: <div id='i2' ><a>土味程序员& ...

  2. 机器学习算法 --- SVM (Support Vector Machine)

    一.SVM的简介 SVM(Support Vector Machine,中文名:支持向量机),是一种非常常用的机器学习分类算法,也是在传统机器学习(在以神经网络为主的深度学习出现以前)中一种非常牛X的 ...

  3. import 导入包的特别用法总结

    指定别名 可以为包指定一个别名,以便记忆或提高输入效率 如 import str "strings" 在使用的时候可以直接使用别名,如原先要写成strings.Contains,现 ...

  4. tree命令详解

    基础命令学习目录首页 原文链接:http://man.linuxde.net/tree -a:显示所有文件和目录:-A:使用ASNI绘图字符显示树状图而非以ASCII字符组合:-C:在文件和目录清单加 ...

  5. TeamWork#2,Week 2,We are sixsix!

    We are sixsix! (从左至右依次是:郝倩.张志浩.高雅智[高哥].牛强.张明培育.彭林江.王卓) 郝倩,来自120617班,我们组7个成员中唯一一个6行政班以外的成员.为了达成组队条件,彭 ...

  6. 奔跑吧DKY——团队Scrum冲刺阶段-Day 7

    今日完成任务 谭鑫:将人物图添加到游戏以及商店界面中,实现商店的选择换装功能 黄宇塘:制作人物图.背景图 赵晓海:阅读所有代码测试所有功能,美化部分界面 方艺雯:为商店界面及关于界面添加必要文字说明 ...

  7. 团队编程--MP3播放器

    设计思路: 这次的作业是一个MP3播放器,它是一个团队项目.由于我们都没接触过这类的编程.刚开始的时候我们是不知道从什么地方着手的.经过我们的商量我们决定从现在市场主流的音乐播放器上找到几个主要的功能 ...

  8. TCP 连接管理

    实验代码和内容:https://github.com/ZCplayground/Understanding-Unix-Linux-Programming/tree/master/11.socket 明 ...

  9. UDP与TCP笔记

    1.UDP UDP协议在工作时是建立在IP协议之上的,UDP从进程的缓冲区接收进程每一次产生的输出,对每次输出都生成一个UDP数据报,然后把生成的UDP数据报直接封装在IP数据报中进行传输,因此在传输 ...

  10. JAVA自学日记——Part Ⅲ

    终于来到了可视化窗口制作的部分了,从学习JAVA之前,到开始入手学习,一直到现在,都在盼望着有一天可以自己写出一款有界面而且是很美观的应用程序,今天算是一个真正开始的时间节点,值得纪念. 内容有很多, ...