题意

一个 \(n\times m\) 的方格纸,有一些格子不能走。给出一个 \(k\) ,求有多少种方案,用 \(k\) 个不相交,不嵌套 的环覆盖所有可以走的格子。\(n,m\le 12\) 。

分析

若只有 \(k\) 个环的限制,那把它放进状态里就可以了。关键是如何解决不嵌套问题。我们在一个环形成的时候处理嵌套。若这个环被奇数个插头套着,那它至少会被它外层的那对插头形成的环包含,所以不转移。若是偶数个,那么接下来继续这样进行,就一定不会发生嵌套的情况。

为什么呢?考虑刚刚形成的这个环,外面的那层线,由于这个环被偶数个插头对套着,所以外层的线是被奇数个插头对套着,所以它一定不能成环,那么就会消除外面的两层。剩下的情况是一样的。

于是讨论一下,转移即可。

复杂度为 \(O(nm|s|)\) 。

这也算是插头dp棋盘模型的一个结束了。

代码

卡掉了所有的内置 hash_table 。终于手写了一次,因为不想改代码,所以实现了大部分接口,除了 map::iterator 不知道怎么实现,不过也不是很需要。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ui;
typedef long long giant;
const int maxn=14;
const int maxs=3e5;
const ui haq=3e5+7;
const int q=1e9+7;
inline int Plus(int x,int y) {return ((giant)x+(giant)y)%q;}
inline void Pe(int &x,int y) {x=Plus(x,y);}
int n,m,ned;
bool no[maxn][maxn];
struct Hash {
struct E {
ui v;
int w,nxt;
} e[maxs];
int h[haq],tot;
inline void clear() {tot=0,memset(h,0,sizeof h);}
Hash () {clear();}
inline int& operator [] (ui x) {
ui wh=x%haq;
for (int i=h[wh];i;i=e[i].nxt) if (e[i].v==x) return e[i].w;
e[++tot]=(E){x,0,h[wh]};
return e[h[wh]=tot].w;
}
};
struct Map {
Hash *hs;
Map () {hs=new Hash();}
inline void clear() {hs->clear();}
inline int& operator [] (ui x) {return (*hs)[x];}
inline void swap(Map &o) {
std::swap(hs,o.hs);
}
} f,g;
void get(Map &g) {
for (int i=1;i<=g.hs->tot;++i) printf("[%llu]: %d, ",g.hs->e[i].v,g.hs->e[i].w);
puts("");
}
int mt[maxn];
inline ui get(ui x,int p) {
if (p==m+2) return x>>((m+2)<<1);
return (x>>(p<<1))&3;
}
inline ui mod(ui x,int p,ui d) {
if (p==m+2) {
ui bef=x&((1u<<((m+2)<<1))-1);
return bef+(d<<((m+2)<<1));
}
return (x&(~(3<<(p<<1))))+(d<<(p<<1));
}
inline void match(ui x,int *mt) {
static int sta[maxn];
int top=0;
for (int i=0;i<maxn;++i) mt[i]=0;
for (int i=1;i<=m+1;++i) {
const ui d=get(x,i);
if (d==1) sta[++top]=i; else if (d==2) {
int p=sta[top--];
mt[p]=i,mt[i]=p;
}
}
}
void dec(ui x) {
for (int j=1;j<=m+1;++j) printf("%llu ",get(x,j));
printf("%llu\n",get(x,m+2));
}
void work() {
scanf("%d%d%d",&n,&m,&ned);
memset(no,0,sizeof no);
for (int i=1;i<=n;++i) {
static char s[maxn];
scanf("%s",s+1);
for (int j=1;j<=m;++j) no[i][j]=(s[j]=='*');
}
if (ned>n*m/4) {
puts("0");
return;
}
f.clear(),g.clear();
f[0]=1;
for (int i=1;i<=n;++i) {
f.swap(g),f.clear();
for (int it=1;it<=g.hs->tot;++it) {
const ui &d=g.hs->e[it].v,s=get(d,m+2);
const int &w=g.hs->e[it].w;
if (get(d,m+1)==0) Pe(f[mod(mod(d,m+2,0)<<2,m+2,s)],w);
}
for (int j=1;j<=m;++j) {
f.swap(g),f.clear();
for (int it=1;it<=g.hs->tot;++it) {
const ui &d=g.hs->e[it].v,s=get(d,m+2),e=mod(mod(d,j,0),j+1,0),x=get(d,j),y=get(d,j+1);
const int &w=g.hs->e[it].w;
match(d,mt);
if (no[i][j]) {
if (x==0 && y==0) Pe(f[d],w);
continue;
}
if (x==0 && y==0) Pe(f[mod(mod(e,j,1),j+1,2)],w); else
if (x==0 || y==0) {
Pe(f[mod(e,j,x+y)],w);
Pe(f[mod(e,j+1,x+y)],w);
} else if (x==1 && y==1) Pe(f[mod(e,mt[j+1],1)],w);
else if (x==2 && y==2) Pe(f[mod(e,mt[j],2)],w);
else if (x==2 && y==1) Pe(f[e],w);
else if (x==1 && y==2) {
if (s>=ned) continue;
int cnt=0;
for (int k=1;k<j;++k) cnt+=(bool)get(d,k);
if (~cnt&1) Pe(f[mod(e,m+2,s+1)],w);
}
}
}
}
printf("%d\n",f[mod(0,m+2,ned)]);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int T;
scanf("%d",&T);
while (T--) work();
return 0;
}

hdu4285-circuits的更多相关文章

  1. 【hdu4285】 circuits

    http://acm.hdu.edu.cn/showproblem.php?pid=4285 (题目链接) 题意 求不不能嵌套的回路个数为K的路径方案数. Solution 插头dp,时限卡得太紧了, ...

  2. 乱码电路(Garbled circuits)

    乱码电路(Garbled circuits)是Andrew Yao教授在上世纪80年代发明的一种很聪明的技术.它可以让两个人针对某个算式来计算答案,而不需要知道他们在计算式所输入的数字. 举个例子说, ...

  3. HDU 3157 Crazy Circuits(有源汇上下界最小流)

    HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...

  4. hdoj 3157 Crazy Circuits 【有下界最小流】

    题目:hdoj 3157 Crazy Circuits 题意:如今要制造一个电路板.电路板上有 n 个电子元件,各个元件之间有单向的电流流向.然后有一个 + .电流进入, -- 电流汇入,然后推断能不 ...

  5. hdu Crazy Circuits

    Crazy Circuits 题目: 给出一个电路板,从+极出发到负极. 如今给你电路板上的最小电流限制,要你在电流平衡的时候求得从正极出发的最小电流. 算法: 非常裸的有源汇最小流.安有源汇最大流做 ...

  6. specialized English for automation-Lesson 2 Basic Circuits of Operational Amplifiers

    排版有点乱.... ========================================================================= Operational Ampl ...

  7. HDU 3157 Crazy Circuits (有源汇上下界最小流)

    题意:一个电路板,上面有N个接线柱(标号1~N)   还有两个电源接线柱  +  - 然后是 给出M个部件正负极的接线柱和最小电流,求一个可以让所有部件正常工作的总电流. 析:这是一个有源汇有上下界的 ...

  8. HDU 3157 Crazy Circuits

    Crazy Circuits Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ...

  9. 香农的伟大论文《A Symbolic Analysis of Relay and Switching Circuits》

    香农在1938年发表的伟大论文A Symbolic Analysis of Relay and Switching Circuits(<对继电器和开关电路中的符号分析>)将开关.继电器.二 ...

  10. HDU 4285 circuits( 插头dp , k回路 )

    circuits Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. JDBC注册驱动的三种方式(MySQL)

    第一种:通过反射Class.forName("com.mysql.jdbc.Driver"); 第二种:通过DriverManage的静态方法DriverManager.regis ...

  2. flask中的宏

    对于flask中的宏编程.我们使用 macro 来对宏起个名称 宏编程 对于我们来说是减少了代码的重用.以及简化了标签的操作,对与开发效率有很大的提升, 在html中.相信大多数都用到了.input ...

  3. HTML文件转Word文件格式

    这是我需要转换的HTML文件 第一步~ 使用我们的福昕阅读器将我们.html文件打开,如下图 第二步: 点击“文件”——“另存为”——选择一个你自己喜欢的位置存放文件,此时的文件已经被转换成了.pdf ...

  4. 在IIS中部署Asp.Net网站

    在IIS中部署Asp.Net网站 1.添加IIS或者删除IIS,在控制面板=>程序和功能=>打开或关闭功能 启动iis,右键计算机=>管理=>服务和应用程序=>Inter ...

  5. cmd下执行mysql

    1.  mysql -uroot -p1234; 2.  show databases; 3.  use testnode; 4. 创建数据库表 CREATE DATABASE `node` DEFA ...

  6. Linux虚拟机安装教程

    必备组件: vmware(程序主题) 链接:https://pan.baidu.com/s/14OplOGOQTVAnf0iDqgDhDQ 提取码:jape centos(Linux系统) 链接:ht ...

  7. 开发简单的IO多路复用web框架

    自制web框架 1.核心IO多路复用部分 # -*- coding:utf-8 -*- import socket import select class Snow(): def __init__(s ...

  8. TeamWork#3,Week5,Scrum Meeting 11.13

    最近我们根据之前发现的问题, 补充了相关知识,正在努力修复出现的问题,调整程序结构. 成员 已完成 待完成 彭林江 之前没有考虑到网站信息更新导致的程序可变性,正在调整爬虫程序结构 更换爬虫结构 郝倩 ...

  9. 20135313-exp1

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353 姓名:吴子怡 学号:20135313 成绩:            指导教师:娄嘉鹏  实 ...

  10. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...