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

$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. Solr版本安装部署指南

    一.依赖包 1.  JDK 1.6以上 2.  solr-4.3.0.tgz 3.  Tomcat或者jetty(注意,solr包中本身就含有jetty的启动相关内容):apache-tomcat-7 ...

  2. 120. Triangle 以及一个多维vector如何初始化

    1.刚开始result的初始化写的是vector<vector<int>> result,然后再去对result[0][0] = triangle[0][0]赋值,一直报错.老 ...

  3. C05 C语言字符串和数组

    目录 数组 字符串 数组 概念 数组是有序数据的集合. 数组中的每一个元素属于同一个数据类型. 通过数组名和下标唯一确定数组中的元素. 一维数组的定义 语法格式 数据类型   数组名[常量表达式] 例 ...

  4. ueditor中FileUtils.getTempDirectory()找不到

    2014-6-27 14:22:25 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() fo ...

  5. Bootstrap 网格系统(Grid System)实例2

    Bootstrap 网格系统(Grid System):堆叠水平,两种样式 <!DOCTYPE html><html><head><meta http-equ ...

  6. viewDidLoad、viewWillAppear、viewWillDisappear

    - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil viewDidLo ...

  7. [LUOGU] P2330 [SCOI2005]繁忙的都市

    题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条 ...

  8. 【Java_多线程并发编程】JUC原子类——4种原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: Atom ...

  9. 004 html常用标签

    html常用标签 1.无语义标签 <div></div> <span></span> 2.常用语义标签 <hn></hn> 标题 ...

  10. 蓝牙学习 (8)配对raspberryPi和SensorTag CC2650

    在上一篇中,用raspberryPi能够扫描到Ti SensorTag. 但是没有获得更多的数据,并且发现sensor Tag并没有回复scan request. https://blog.csdn. ...