题解:

插头dp

具体可以看看cdq论文

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
int n,m,ex,ey;
char s[][];
struct node
{
int H[N],tot,st[N];
ll s[N];
void init()
{
memset(H,,sizeof(H));
tot=;
}
void add(int S,ll v)
{
int i=S%N;
for (;H[i]>=&&st[H[i]]!=S;i=(i+)%N);
if (H[i]<)
{
st[tot]=S;
s[tot]=v;
H[i]=tot++;
}
else s[H[i]]+=v;
}
}f[];
int Get(int x,int y)
{
return (x>>(y<<))&;
}
int Set(int &z,int x,int y)
{
z^=Get(z,x)<<(x<<);
z^=y<<(x<<);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<n;i++)
{
scanf("%s",s[i]);
for (int j=;j<m;j++)
if (s[i][j]=='.')
{
ex=i;
ey=j;
}
}
int p=,q=;
f[p].s[]=; f[p].tot=;
for (int i=;i<n;i++)
{
for (int j=;j<m;j++,p^=,q^=)
{
f[q].init();
if (s[i][j]=='*')
{
for (int k=;k<f[p].tot;k++)
{
int st=f[p].st[k];
ll s=f[p].s[k];
if (!Get(st,j)&&!Get(st,j+))f[q].add(st,s);
}
continue;
}
for (int k=;k<f[p].tot;k++)
{
int st=f[p].st[k],x=Get(st,j),y=Get(st,j+);
ll s=f[p].s[k];
if (!x)
{
if (!y)
{
if (j==m-) continue;
Set(st,j,); Set(st,j+,);
f[q].add(st,s);
}
else
{
if (j<m-) f[q].add(st,s);
Set(st,j+,); Set(st,j,y);
f[q].add(st,s);
}
}
else if (!y)
{
f[q].add(st,s);
if (j==m-) continue;
Set(st,j,); Set(st,j+,x);
f[q].add(st,s);
}
else
{
Set(st,j,); Set(st,j+,);
if (x==)
{
if (y==)
{
for (int k=j+,t=;;k++)
{
if (Get(st,k)==) t++;
else if (Get(st,k)==)
{
t--;
if (!t)
{
Set(st,k,);
f[q].add(st,s);
break;
}
}
}
}
else if (i==ex && j==ey) f[q].add(st,s);
}
else
{
if (y==) f[q].add(st,s);else
{
for (int k=j-,t=;;k--)
{
if (Get(st,k)==) t++;
else if (Get(st,k)==)
{
t--;
if (!t)
{
Set(st,k,);
f[q].add(st,s);
break;
}
}
}
}
}
}
}
}
for (int j=;j<f[p].tot;j++) f[p].st[j]<<=;
}
for (int i=;i<f[p].tot;i++)
if (f[p].st[i]==)
{
printf("%lld\n",f[p].s[i]);
return ;
}
puts("");
return ;
}

ural1519的更多相关文章

  1. URAL1519:Formula 1——题解

    http://acm.timus.ru/problem.aspx?space=1&num=1519 https://vjudge.net/problem/URAL-1519 题目大意:给一个网 ...

  2. URAL1519 Formula 1 【插头dp】

    题目链接 URAL1519 题解 看题型显然插头\(dp\) 考虑如何设计状态 有这样一个方案 当我们决策到某个位置 轮廓线长这样 你会发现插头一定是相互匹配的 所以我们实际上可以把状态用括号序列表示 ...

  3. URAL1519 Formula 1 —— 插头DP

    题目链接:https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 secondMemory limit: 64 MB ...

  4. ural1519插头DP

    1519. Formula 1 Time limit: 1.0 second Memory limit: 64 MB Background Regardless of the fact, that V ...

  5. 2019.01.23 ural1519 Formula 1(轮廓线dp)

    传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...

  6. [URAL1519] Formula 1 [插头dp入门]

    题面: 传送门 思路: 插头dp基础教程 先理解一下题意:实际上就是要你求这个棋盘中的哈密顿回路个数,障碍不能走 看到这个数据范围,还有回路处理,就想到使用插头dp来做了 观察一下发现,这道题因为都是 ...

  7. POJ 1739

    楼教主男人八题之一... 题目大意: 求从左下角经过所有非障碍点一次到达右下角的方案数 这里不是求回路,但是我们可以考虑,在最下面一行再增加一行,那么就可以当做求此时左下角到右下角的回路总数,那么就转 ...

  8. HDU 1693 二进制表示的简单插头dp

    题目大意: 找到多条回路覆盖所有非障碍格子,问这样回路的种数 这里的插头与URAL1519 不一样的是 只要管它是否存在即可,只需要1个二进制位表示状态 #include <cstdio> ...

  9. 插头dp的几个模板

    /* ural1519 求经过全部可行点的哈密顿回路的个数 括号匹配法,转移有点复杂,可是时间空间比較小 */ #include<cstdio> #include<cstring&g ...

随机推荐

  1. sort-桶排序

    void list_insert(list<int> &t,int num) { auto iter=t.begin(); for(;iter!=t.end();++iter) { ...

  2. 学习笔记57—归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)

    1 概念   归一化:1)把数据变成(0,1)或者(1,1)之间的小数.主要是为了数据处理方便提出来的,把数据映射到0-1范围之内处理,更加便捷快速.2)把有量纲表达式变成无量纲表达式,便于不同单位或 ...

  3. Debug记录(1)

    今天下午在给nRF52832写程序时,莫名遇到了这个错误 错误id是一个很奇怪的数. 原代码如下: static void timers_init(void) { uint32_t timer_err ...

  4. R语言做一元线性回归

    只有两个变量,做相关性分析,先来个一元线性回归吧 因为未处理的x,y相关性不显著,于是用了ln(1+x)函数做了个处理(发现大家喜欢用ln,log,lg,指数函数做处理),处理完以后貌似就显著了..虽 ...

  5. JavaScript Transpilers: 为什么需要用它们?Babel的使用介绍。

    英文原文 https://scotch.io/tutorials/javascript-transpilers-what-they-are-why-we-need-them 摘译(文章内的代码有些过期 ...

  6. git部署

    1. 自动部署原理 先讲实现方法和原理.Git服务和仓库都是在服务器上的,服务器上的Web目录和本地都有完整的代码.Git有个叫hook的机制,可以在代码更新时执行回调(执行一段shell).一般执行 ...

  7. 深入解析 composer 的自动加载原理 (转)

    深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...

  8. CentOS6.8逻辑卷管理实战

    CentOS6.8逻辑卷管理实战 要求:利用现有的四块磁盘,创建一个有两个PV组成的大小为80G的名为testvg的VG:要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv:挂载 ...

  9. 浅谈cookie、session

    揭秘Cookie: cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是可 ...

  10. loj#2353. 「NOI2007」 货币兑换 斜率优化

    题意略 题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i] ...