插头DP--URAL1519Formula 1
去年的老朋友。挺怀念的,回来看看。
$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的更多相关文章
- 插头dp
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...
- HDU 4113 Construct the Great Wall(插头dp)
好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...
- HDU 4949 Light(插头dp、位运算)
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...
- 插头DP专题
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...
- HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)
插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...
- HDU 1693 Eat the Trees(插头DP)
题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...
- 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 ...
- URAL 1519 基础插头DP
题目大意: 给定一个图,一部分点'*'作为障碍物,求经过所有非障碍点的汉密尔顿回路有多少条 基础的插头DP题目,对于陈丹琦的论文来说我觉得http://blog.sina.com.cn/s/blog_ ...
- uva 11270 - Tiling Dominoes(插头dp)
题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 668 Solved: 337[Submit][Statu ...
随机推荐
- Xcode4删除文件后missing file警告
1.运行终端,执行命令行进入missing file目录,然后运行 svn delete nameOfMissingFile 或 git rm nameOfMissingFile 2.删除隐藏的.sv ...
- MINST手写数字识别(三)—— 使用antirectifier替换ReLU激活函数
这是一个来自官网的示例:https://github.com/keras-team/keras/blob/master/examples/antirectifier.py 与之前的MINST手写数字识 ...
- 【转】数据库SQL的一些总结
http://www.cnblogs.com/yank/category/104903.html
- AppCrawler自动化遍历使用详解(版本2.1.0 )(转)
AppCrawle是自动遍历的app爬虫工具,最大的特点是灵活性,实现:对整个APP的所有可点击元素进行遍历点击. 优点: 1.支持android和iOS, 支持真机和模拟器 2.可通过配置来设定 ...
- 二分查找算法java
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...
- 理解GloVe模型(Global vectors for word representation)
理解GloVe模型 概述 模型目标:进行词的向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息.输入:语料库输出:词向量方法概述:首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学 ...
- Bootstrap历练实例:点击激活的按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- 分布式mysql 和 zk ( zookeeper )的分布式的区别 含冷热数据讨论
zk ( zookeeper )的分布式仅仅指的是备份模式. 分布式 mysql 不仅仅要关注备份(从以往的半主,主主,到 paxos). (mysql 比 hbase 的region成熟, hdfs ...
- MySql中引擎
1. InnoDB 引擎 MySQL 5.5 及以后版本中的默认存储引擎,它的优点如下:灾难恢复性好,支持事务,使用行级锁,支持外键关联,支持热备份. InnoDB引擎中的表,其数据的物理组织形式是簇 ...
- 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...