插头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 ...
随机推荐
- 说说三四月的app审核中的几个坑
苹果的审核在3月异常严格,听说和换了部门领导有关(道听途说),恰逢三月公司新出了一个产品,我们的产品被苹果打回四五次,今天就在简书上把这些坑填下,也让遇到的朋友以后留意,也许是近期的最后一篇文章. 坑 ...
- Luogu P5327 [ZJOI2019]语言
ZJOI2019Day2的温暖题,然后考场上只会大常数的\(O(n\log^3 n)\),就懒得写拿了60pts走人 首先我们简化题意,容易发现每个点能到达的点形成了一个联通块,我们只需要统计出这个联 ...
- House of Spirit(fastbin)
0x01 fastbin fastbin所包含chunk的大小为16 Bytes, 24 Bytes, 32 Bytes, … , 80 Bytes.当分配一块较小的内存(mem<=64 Byt ...
- Hibernate的二级缓存使用(spring使用)
(一)Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库 ...
- javascipt的forEach
1.Array let arr = [1, 2, 3]; arr.forEach(function (element, index, array) { console.log('数组中每个元素:', ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
- 【OS_Linux】yum命令安装软件
1.YUM的简介 Yum(全称为 Yellow dog Updater, Modified)是一个rpm包管理器.它能够从指定的服务器上自动下载RPM包并安装,可以自动处理包之间的依赖性关系,并且一次 ...
- 如何用纯 CSS 创作阶梯文字特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MXYBEM 可交互视频教 ...
- Python9-集合-day7
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的. 以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试 ...
- shell相关指令介绍$*和$#以及$?和if [[ ! -z $1 ]]
$#,脚本运行时后跟的参数个数 #! /bin/bash case "$#" in 0) printf "Enter a number: " read n=$R ...