正题

题目链接:https://www.luogu.com.cn/problem/P5074


题目大意

给出一个\(n\times m\)的网格,有的必须铺线有的不能,铺成若干条闭合回路,求方案数。

\(1\leq n,m\leq 12\)


解题思路

考虑插头\(dp\),因为可以随意开回路,所以就没有严格匹配的限制了,可以直接用二进制记录每个位置有没有插头就好了。

时间复杂度:\(O(nm2^m)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=13;
ll T,n,m,v[N][N],f[2][1<<N];
signed main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld",&n,&m);
for(ll x=0;x<n;x++)
for(ll y=0;y<m;y++)
scanf("%lld",&v[x][y]);
ll o=0,MS=1<<m+1;f[o][0]=1;
for(ll s=1;s<MS;s++)f[o][s]=0;
for(ll x=0;x<n;x++){
o^=1;
for(ll s=0;s<MS;s++)f[o][s]=0;
for(ll s=0;s<MS/2;s++)f[o][s<<1]=f[!o][s];
for(ll y=0;y<m;y++){
o^=1;
for(ll s=0;s<MS;s++)f[o][s]=0;
for(ll s=0;s<MS;s++){
ll u=(s>>y+1)&1,l=(s>>y)&1,g=f[!o][s];
if(!g)continue;
if(!v[x][y]){
if(!u&&!l)
f[o][s]+=g;
}
else{
if(!u&&!l)
f[o][s|(1<<y)|(1<<y+1)]+=g;
else if(u&&!l){
f[o][s]+=g;//转右
f[o][s^(1<<y)^(1<<y+1)]+=g;//转下
}
else if(!u&&l){
f[o][s]+=g;//转下
f[o][s^(1<<y)^(1<<y+1)]+=g;//转右
}
else{
f[o][s^(1<<y)^(1<<y+1)]+=g;
}
}
}
}
}
printf("%lld\n",f[o][0]);
}
return 0;
}

P5074-Eat the Trees【插头dp】的更多相关文章

  1. HDU 1693 Eat the Trees(插头DP)

    题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...

  2. HDU1693 Eat the Trees 插头dp

    原文链接http://www.cnblogs.com/zhouzhendong/p/8433484.html 题目传送门 - HDU1693 题意概括 多回路经过所有格子的方案数. 做法 最基础的插头 ...

  3. hdu 1693 Eat the Trees——插头DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693 第一道插头 DP ! 直接用二进制数表示状态即可. #include<cstdio> # ...

  4. HDU 1693 Eat the Trees ——插头DP

    [题目分析] 吃树. 直接插头DP,算是一道真正的入门题目. 0/1表示有没有插头 [代码] #include <cstdio> #include <cstring> #inc ...

  5. HDU1693 Eat the Trees —— 插头DP

    题目链接:https://vjudge.net/problem/HDU-1693 Eat the Trees Time Limit: 4000/2000 MS (Java/Others)    Mem ...

  6. hdu1693 Eat the Trees [插头DP经典例题]

    想当初,我听见大佬们谈起插头DP时,觉得插头DP是个神仙的东西. 某大佬:"考场见到插头DP,直接弃疗." 现在,我终于懂了他们为什么这么说了. 因为-- 插头DP很毒瘤! 为什么 ...

  7. hdu1693:eat trees(插头dp)

    题目大意: 题目背景竟然是dota!屠夫打到大后期就没用了,,只能去吃树! 给一个n*m的地图,有些格子是不可到达的,要把所有可到达的格子的树都吃完,并且要走回路,求方案数 题解: 这题大概是最简单的 ...

  8. P5074 Eat the Trees

    思路 同样是插头DP,但是这题因为可以形成多个回路,所以左右括号是没有区别的,只需要01就可以表示了 注意if的嵌套关系 注意全零矩阵也要输出1 代码 #include <cstdio> ...

  9. 插头dp小结

    插头dp: \(A:\)插头dp是什么? \(B:\)一种基于连通性状态压缩的动态规划问题 \(A:\)请问有什么应用呢? \(B:\)各种网格覆盖问题,范围允许状压解决,常用于计算方案数与联通块权值 ...

  10. 【HDOJ】【1693】Eat The Trees

    插头DP 插头dp模板题…… 这题比CDQ论文上的例题还要简单……因为不用区分左右插头(这题可以多回路,并不是一条哈密尔顿路) 硬枚举当前位置的状态就好了>_< 题解:http://blo ...

随机推荐

  1. mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?

    Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. m ...

  2. C#多线程详解(一) Thread.Join()的详解

    bicabo   C#多线程详解(一) Thread.Join()的详解 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程 ...

  3. 异步编程之APM

    一.APM概述 APM即异步编程模型的简写(Asynchronous Programming Model),我们平时经常会遇到类似BeginXXX和EndXXX的方法,我们在使用这些方法的时候,其实就 ...

  4. 【权限管理】springboot集成security

    摘自: https://www.cnblogs.com/hhhshct/p/9726378.html https://blog.csdn.net/weixin_42849689/article/det ...

  5. Mybatis出现错误org.apache.ibatis.executor.ExecutorException: No constructor found in

    错误显示没有发现构造器. 其实就是重写了构造器后,忘了补写一个默认的空参构造器了.此类的错误还经常出现在spring等这种大量使用反射的框架中.因为这些框架在调用反射的类后会默认调用默认的构造器 解决 ...

  6. restore db fail

    System.Data.SqlClient.SqlError: The operating system returned the error '5(Access is denied.)' while ...

  7. The Second Week lucklyzpp

    The Second Week  文件通配符模式  在Linux系统中预定义的字符类 1.显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 2.复制/etc目录下 ...

  8. vue3.0入门(三)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 class绑定 对象绑定 :class='{active:isActive}' // 相当于class="active&q ...

  9. Hexo搭建个人静态博客网站

    前言 前段时间博客园整改,许多博客无法查看,偶然的机会接触到了许多博客框架,可用来快速搭建一个静态博客网站:最后选择使用hexo,看了不少大佬的教程,觉得挺有意思的,于是也总结了一下自己的搭建步骤,可 ...

  10. 移动端常用单位——rem

    移动端常用单位: ①px:像素大小,固定值 ②%:百分比 ③em(不常用,但是在首行缩进时可以使用):相对自身的font大小(当自身的字体大小也是em做单位时,才会以父元素的字体大小为基准单位) ④r ...