题目大意:要求你将全部非障碍格子都走一遍,形成回路(能够多回路),问有多少种方法

解题思路:

參考基于连通性状态压缩的动态规划问题 - 陈丹琦

下面为代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 12
#define S (1 << 12)
int n, m;
long long dp[N][N][S];
int cas = 1; void solve() {
scanf("%d%d", &n, &m);
memset(dp, 0, sizeof(dp)); int num;
dp[0][0][0] = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
scanf("%d", &num);
for(int k = 0; k < (1 << (m + 1)); k++) {
int left = k & (1 << m);
int up = k & (1 << j);
int l = (1 << m);
int u = (1 << j);
//假设是障碍
if(num == 0) {
if(!left && !up)
dp[i][j + 1][k] += dp[i][j][k];
continue;
}
//假设有左边那一个有右插头。上面那一个有下插头,那么当前格子仅仅能是L的镜像了,也就是左上型
if(left && up) {
dp[i][j + 1][k - l - u] += dp[i][j][k];
}//假设仅仅有左边那个有左插头。上面那个没有下插头,那么当前的可能有右插头,或者左下型插头
else if(left) {
dp[i][j + 1][k] += dp[i][j][k];
dp[i][j + 1][k - l + u] += dp[i][j][k];
}//假设仅仅有上面那个有下插头。左边那个没有右插头,那么当前的可能有下插头,或者上右型插头
else if(up) {//
dp[i][j + 1][k] += dp[i][j][k];
dp[i][j + 1][k - u + l] += dp[i][j][k];
}//假设上面没有下插头,左边没有右插头。那么仅仅能是下右型插头了
else {
dp[i][j + 1][k + l + u] += dp[i][j][k];
}
}
}
for(int j = 0; j < (1 << m); j++)
dp[i + 1][0][j] = dp[i][m][j];
}
printf("Case %d: There are %I64d ways to eat the trees.\n", cas++, dp[n][0][0]);
} int main() {
int test;
scanf("%d", &test);
while(test--) {
solve();
}
return 0;
}

HDU - 1693 Eat the Trees(多回路插头DP)的更多相关文章

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

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

  2. HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)

    插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...

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

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

  4. HDU 1693 Eat the Trees(插头DP,入门题)

    Problem Description Most of us know that in the game called DotA(Defense of the Ancient), Pudge is a ...

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

    题意:给一个n*m的矩阵,为1时代表空格子,为0时代表障碍格子,问如果不经过障碍格子,可以画一至多个圆的话,有多少种方案?(n<12,m<12) 思路: 这题不需要用到最小表示法以及括号表 ...

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

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

  7. hdu 1693 : Eat the Trees 【插头dp 入门】

    题目链接 题意: 给出一个n*m大小的01矩阵,在其中画线连成封闭图形,其中对每一个值为1的方格,线要恰好穿入穿出共两次,对每一个值为0的方格,所画线不能经过. 参考资料: <基于连通性状态压缩 ...

  8. HDU 1693 Eat the Trees

    第一道(可能也是最后一道)插头dp.... 总算是领略了它的魅力... #include<iostream> #include<cstdio> #include<cstr ...

  9. 【HDU】1693 Eat the Trees

    http://acm.hdu.edu.cn/showproblem.php?pid=1693 题意:n×m的棋盘求简单回路(可以多条)覆盖整个棋盘的方案,障碍格不许摆放.(n,m<=11) #i ...

随机推荐

  1. 控件动态产生器(使用RegisterClasses提前进行注册)

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...

  2. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

    CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...

  3. java中path和classpath

    Path 路径,是java编译时需要调用的程序(如java,javac等)所在的地方; CLASSPATH的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从class ...

  4. 【HDOJ】1706 The diameter of graph

    这么个简单的题目居然没有人题解.floyd中计算数目,同时注意重边. /* 1706 */ #include <iostream> #include <string> #inc ...

  5. hadoop namenode启动过程详细剖析及瓶颈分析

    NameNode中几个关键的数据结构 FSImage Namenode 会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有hdfs操 ...

  6. WPF编程学习——动画

    前言 使用动画,是增强用户体验的一种有效的手段.合理的动画,可以让应用程序的界面看起来更加自然.真实.流畅.舒适,更有效地向用户展现信息,用户也更容易接受.同时也增加了软件使用的乐趣,提高用户粘度.( ...

  7. 将win7电脑变身WiFi热点

    转自:http://bbs.feng.com/read-htm-tid-2167498.html 开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路 ...

  8. HDU-3706 Second My Problem First

    http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 MS (Ja ...

  9. [liu yanling]规范软件测试流程

    测试计划 做任何事情都会有输入输出,对于测试过程我们可以把输入理解为测试计划.测试环境准备.测试工具的选择等等,输出可以理解为测试结果.测试用例设计即可以理解为以测试计划为输入的输出,也可以理解为以测 ...

  10. Redis和Memcache的对比

    我这段时间在用redis,感觉挺方便的,但比较疑惑在选择内存数据库的时候到底什么时候选择redis,什么时候选择memcache,然后就查到下面对应的资料,是来自redis作者的说法(stackove ...