bzoj 1814: Ural 1519 Formula 1 插头dp经典题
用的括号序列,听说比较快。
然并不会预处理,只会每回暴力找匹配的括号。
#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经典题的更多相关文章
- 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 ...
- 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
[BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...
- Ural 1519 Formula 1 插头DP
这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连 ...
- bzoj 1814: Ural 1519 Formula 1【插头dp】
设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把 ...
- BZOJ1814: Ural 1519 Formula 1(插头Dp)
Description Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic gam ...
- 【Ural】1519. Formula 1 插头DP
[题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题 ...
- 【BZOJ1814】Ural 1519 Formula 1 (插头dp)
[BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...
随机推荐
- 深度学习中数据的augmentation
为了提高模型的泛化能力,同时也为了增大数据集,我们往往需要对数据进行augmentation,在这篇博客中,将总结一下可以对数据进行的augmentation. 1.颜色数据增强,对图像亮度.饱和度. ...
- Android工程导入Unity3D(避坑版)
最近与各种牛逼的项目管理软件打交道,比如SourceTree,要看英文版的才看得懂,中文反而不会用!... 这篇博客适合没怎么接触过安卓的小伙伴们,网上也有很多相关的教程,但是大多都没有具体的操作或则 ...
- kali linux执行apt-get update失败(数字签名过期)
想要安装某个软件,执行apt-get update 失败,出现下面的错误: 自己查看了更新源是没有问题的,根据提示的错误google了一下,发现是数字签名过期了. 执行下面命令: apt-key ad ...
- Nginx是如何配置为 Web 服务器的【转载】
详解 Nginx是如何配置为 Web 服务器的 林涛 发表于:2016-11-29 23:23 分类:WebServer 标签:Nginx,web,web服务器 521次 抽象来说,将 Nginx 配 ...
- “Hello World!”团队第七周召开的第六次会议
博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八 .功能说明书 一.会议时间 2017年12月6日 11:20-12:00 二 ...
- Data truncation: Truncated incorrect DOUBLE value:
在写sql查询语句queryRunner.update(connection,"update account set balance=? where name=?",account ...
- 团队冲刺--six
昨天: 司宇航:合并版块,但部分有缺陷. 马佳慧:研究css. 王金萱:写注册界面. 季方: 研究爬虫,精确的处理数据. 今天: 司宇航:测试功能版块,优化功能版块. 马佳慧:优化界面 . 王金萱: ...
- 利用python进行简单的图像处理:包括打开,显示以及保存图像
利用python进行简单的图像处理:包括打开,显示以及保存图像 利用PIL处理 PIL(python image library) 是python用于图片处理的package.但目前这个package ...
- BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 46 Solved: 18[Submit][Status][Discus ...
- unix网络编程——I/O多路复用之epoll
1. 基本概念 当程序进行IO时,如果数据尚未准备好,那么IO将处于阻塞状态.当某个进程有多个打开的文件,比如socket,那么其后的所有准备好读写的文件将受到阻塞的影响而不能操作.不借助线程,单一进 ...