插头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 ...
随机推荐
- 程序windows上可以上传附件,部署到 linux服务器后出现 “上传目录 不可写” 怎么解决?
这样的问题一般都是linux 下文件读写权限引起的,用 shell 命名到上传附件的目录(如 cd /data/www/project/upload/),然后执行 shell 文件权限设置: 例如 ...
- Codeforces Round #316 (Div. 2) B Simple Game 贪心
贪心,如果m分成的两个区间长度不相等,那么选长的那个区间最接近m的位置,否则选m-1位置,特判一下n等于1的情况 #include<bits/stdc++.h> using namespa ...
- C++类构造函数、析构函数运行机理
http://blog.sina.com.cn/s/blog_6fd68d5f0100n60h.html 前言--构造函数.析构函数的简单理解:1)构造函数---对象被创建时候调用的函数:2)析构函数 ...
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- struct结构体内存大小
一. 基本原则 1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的: 2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长 ...
- QT+常用控件_Line Edit
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #incl ...
- 思维 || Make It Equal
http://codeforces.com/contest/1065/problem/C 题意:给你n个高度分别为a[i]的塔,每次可以横着切一刀,切掉不多于k个塔,问最少切多少刀才能把塔切的都一样高 ...
- class extension、class category、class-continuation category
class extension Objective-C 2.0增加了class extensions用于解决两个问题: 允许一个对象可以拥有一个私有的interface,且可由编译器验证. 支持一个公 ...
- javascript(函数式编程思考) ---> Map-Filter-quicksort-Collatz序列-Flodl-Flodr
let add = x=>x+1; //Map :: ( a -> b) -> [a] -> [b] let Map = function(f,arr){ //闭包存储累积对象 ...
- 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...