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 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...
随机推荐
- linux go环境安装
方法一 这次将源码包安装的目录是是/root下. 1.官网下载源码包. 官网链接:https://golang.org/dl/ wget https://storage.googleapis.co ...
- Node of C++ Linker.
code is nothing without data. data segment - the program memory storing initialized global variable. ...
- jenkins展示report测试报告的配置
HTML报告展示 1. 需要HTML Publisher plugin插件 2. 在workspace下的工程(构建)中的目录中存储测试报告 在Jenkins中新建一个job,进入配置项. 首先通过p ...
- Scrum立会报告+燃尽图(十二月八日总第三十九次):制定视频方案
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- PSP Daily软件beta版本——基于spec评论
题目要求: 每个小组评论其他小组beta发布作品的软件功能说明书. 试用(并截图)所有其他小组的beta作品,与软件功能说明书对比,评论beta作品对软件功能说明书的实现. 根据软件功能说明书,测试所 ...
- [2019BUAA软工]第0次代码作业
Visual Studio 单元测试的简单应用 写在前面 笔者根据作业的介绍以及Visual Studio 2017 文档的相关说明,进行了Visual Studio 单元测试的简单应用. Tip ...
- 面向对象程序设计第三次作业-Calculator
题目: 最终代码: Scan.h: Print.h: Calaulator.cpp: 解题过程 看到题目后,在查询之后明白了这是多文件的题目,然后通过翁凯老师的视频讲解知道了.h和.cpp文件的区别和 ...
- jquery ajax 跨域问题
前言:关于跨域CORS 1.没有跨域时,ajax默认是带cookie的 2.跨域时,两种解决方案: 1)服务器端在filter中配置 详情:http://blog.csdn.net/wzl002/ar ...
- Java中的常见异常
非检查异常:Error 和 RuntimeException 以及他们的子类.0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界Ar ...
- React监听窗口变化事件
功能说明:本例子采用MUI table组件 + React实现. 需求描述:固定表头,列表高度随浏览器窗口的改变而改变.(本例中当窗口高度小于472像素后,便不作限制) 实现简介:1.监听浏览器窗口, ...