去年的老朋友。挺怀念的,回来看看。

$n \leq 12,m \leq 12$,$n*m$的01矩形,问在0中走路的欧拉回路数。答案保证longlong范围。

先设计插头:左右括号和空插头;然后分3*3种情况转移。耐心。

 //#include<iostream>
#include<cstring>
#include<cstdio>
//#include<time.h>
//#include<complex>
#include<algorithm>
#include<stdlib.h>
using namespace std; int n,m; bool mp[][];
#define maxn 2333333
#define LL long long
int state[][maxn],len[]; LL ans[][maxn]; int cur;
int Next[maxn],first[maxn]; void insert(int x,LL v)
{
int y=cur^,h=x%maxn;
for (int i=first[h];i;i=Next[i]) if (state[y][i]==x) {ans[y][i]+=v; return;}
state[y][++len[y]]=x; ans[y][len[y]]=v;
Next[len[y]]=first[h]; first[h]=len[y];
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
char c; while ((c=getchar())!='.' && c!='*');
mp[i][j]=(c=='*');
}
//0 kong di 1 zhang ai int endx=,endy;
for (int i=n;i && !endx;i--)
for (int j=m;j;j--)
if (!mp[i][j]) {endx=i; endy=j; break;} cur=; insert(,); cur=; LL Ans=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
for (int k=;k<=len[cur];k++) first[state[cur][k]%maxn]=;
for (int k=;k<=len[cur];k++)
{
int now=state[cur][k],p=now&,q=(now>>)&,nk;
if (mp[i][j]) {if (p== && q==) nk=now>>,insert(nk,ans[cur][k]);}
else if (p== && q==) {if (j<m) {nk=(now>>)||(<<(m<<)); insert(nk,ans[cur][k]);}}
else if (p== && q)
{
nk=((now>>)^q)|(q<<(m<<)); insert(nk,ans[cur][k]);
if (j<m) {nk=now>>; insert(nk,ans[cur][k]);}
}
else if (p && q==)
{
nk=(now>>)|(p<<(m<<)); insert(nk,ans[cur][k]);
if (j<m) {nk=(now>>)|p; insert(nk,ans[cur][k]);}
}
else if (p== && q==)
{
int cnt=; nk=(now>>)^q;
for (int l=;;l++)
{
int hh=(now>>(l<<))&;
if (hh==) cnt++; if (hh==) cnt--;
if (cnt==) {nk=(nk^(<<((l-)<<)))^(<<((l-)<<)); break;}
}
insert(nk,ans[cur][k]);
}
else if (p== && q==)
{
nk=(now>>)^q;
insert(nk,ans[cur][k]);
}
else if (p== && q==) {if (i==endx && j==endy && (now^p^(q<<))==) Ans+=ans[cur][k];}
else if (p== && q==)
{
int cnt=,nk=(now>>)^q;
for (int l=m;;l--)
{
int hh=(now>>(l<<))&;
if (hh==) cnt++; if (hh==) cnt--;
if (cnt==) {nk=(nk^(<<((l-)<<)))^(<<((l-)<<)); break;}
}
insert(nk,ans[cur][k]);
}
}
len[cur]=;
cur^=;
}
printf("%lld\n",Ans);
return ;
}

插头DP--URAL1519Formula 1的更多相关文章

  1. 插头dp

    插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...

  2. HDU 4113 Construct the Great Wall(插头dp)

    好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...

  3. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

  4. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  5. HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)

    插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...

  6. HDU 1693 Eat the Trees(插头DP)

    题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...

  7. HDU 4064 Carcassonne(插头DP)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4064 Problem Description Carcassonne is a tile-based ...

  8. URAL 1519 基础插头DP

    题目大意: 给定一个图,一部分点'*'作为障碍物,求经过所有非障碍点的汉密尔顿回路有多少条 基础的插头DP题目,对于陈丹琦的论文来说我觉得http://blog.sina.com.cn/s/blog_ ...

  9. uva 11270 - Tiling Dominoes(插头dp)

    题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...

  10. bzoj 1187: [HNOI2007]神奇游乐园 插头dp

    1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 668  Solved: 337[Submit][Statu ...

随机推荐

  1. Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

    面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...

  2. 理想路径——双向BFS

    题目 给n个点m条边(2 ≤ n ≤ 100000,1 ≤ m ≤ 200000)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量的少,在此前提下,经过边的颜色序列的 ...

  3. js 控制台输出

    var a = 'string'; var b = 123; console.log("The %s jumped over %d tall buildings", a, b); ...

  4. python基础一 day10(1)

    要背的:

  5. caffe实现多label输入(修改源码版)

    http://blog.csdn.net/u013010889/article/details/54614067 这个人的博客本身也相当好

  6. IIS应用程序池"启用32位"导致服务不可用的503错误

    原来运行正常的站点,突然不正常了,出现503错误.查看操作系统的日志查看器显示: 由于配置问题,无法加载模块 DLL“C:\Program Files (x86)\IIS\Asp.Net Core M ...

  7. Ibatis入门基本语法

    1.       Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...

  8. 二. python函数与模块

    第四章.内置函数与装饰器详解 1.内置函数补充1 注:红色圆圈:必会:  紫红色方框:熟练:   绿色:了解 callable() 判断函数是否可以被调用执行 def f1(): pass f1() ...

  9. C++系统学习之二:字符串

    上一篇文章主要学习的是C++的基本类型,它们是C++语言直接定义的,它们体现了计算机硬件本身具备的能力.而本篇文章将主要学习内置类型之外的标准库所定义的类型,分别是string和vector,此外还将 ...

  10. shell-code-5-函数

    # 函数必须在使用前定义 # 如果不写return,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255) myFistFunc(){ read a read b return ...