题解:

插头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. leecode第七题(整数反转)

    题解给的思路: ; class Solution { public: int reverse(int x) { ;//如果这里还是int,会在判断前就被裁剪了,无法判断溢出 ; ) flag=; wh ...

  2. 原生ajax的请求封装get和post

    一个完整的AJAX请求包括五个步骤: 1.创建XMLHTTPRequest对象 2.使用open方法创建http请求,并设置请求地址 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.获取响应 ...

  3. 将本地项目上传到gitlab下

    转载自: https://blog.csdn.net/litianxiang_kaola/article/details/74075151 1.安装git    https://git-scm.com ...

  4. python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件

    第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ...

  5. 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单

    jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单 easyui 的树(Tree)插件允许您创建一个复选框树.如果您点击一个节点的复选框,这个点击的节点信息将向上和向下继承.例如:点击 ...

  6. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格动态加载

    jQuery EasyUI 树形菜单 - 树形网格动态加载 动态加载树形网格有助于从服务器上加载部分的行数据,避免加载大型数据的长时间等待.本教程将向您展示如何创建带有动态加载特性的树形网格(Tree ...

  7. gem "ransack"(4000✨) 简单介绍

    Object-based searching:演示. git:  https://github.com/activerecord-hackery/ransack Gorails视频和我的博客记录:ht ...

  8. webpack添加热更新

    之前的wbepack一直没有加上热更新,这是一种遗憾,今天终于加上去了,看不懂我博客的可以看这篇文章:http://blog.csdn.net/hyy1115/article/details/5302 ...

  9. Spring Batch 批量处理策略

    为了帮助设计和实现批量处理系统,基本的批量应用是通过块和模式来构建的,同时也应该能够为程序开发人员和设计人员提供结构的样例和基础的批量处理程序. 当你开始设计一个批量作业任务的时候,商业逻辑应该被拆分 ...

  10. redis 基本指令

    redis-cli开启redis客户端 1. set key value // 设置key-value 2. get key // 获取key 3. delete key [] // 删除key 4. ...