HDU - 1693 Eat the Trees(多回路插头DP)
题目大意:要求你将全部非障碍格子都走一遍,形成回路(能够多回路),问有多少种方法
解题思路:
參考基于连通性状态压缩的动态规划问题 - 陈丹琦
下面为代码
#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)的更多相关文章
- hdu 1693 Eat the Trees——插头DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693 第一道插头 DP ! 直接用二进制数表示状态即可. #include<cstdio> # ...
- 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 1693 Eat the Trees(插头DP,入门题)
Problem Description Most of us know that in the game called DotA(Defense of the Ancient), Pudge is a ...
- HDU 1693 Eat the Trees (插头DP)
题意:给一个n*m的矩阵,为1时代表空格子,为0时代表障碍格子,问如果不经过障碍格子,可以画一至多个圆的话,有多少种方案?(n<12,m<12) 思路: 这题不需要用到最小表示法以及括号表 ...
- HDU 1693 Eat the Trees ——插头DP
[题目分析] 吃树. 直接插头DP,算是一道真正的入门题目. 0/1表示有没有插头 [代码] #include <cstdio> #include <cstring> #inc ...
- hdu 1693 : Eat the Trees 【插头dp 入门】
题目链接 题意: 给出一个n*m大小的01矩阵,在其中画线连成封闭图形,其中对每一个值为1的方格,线要恰好穿入穿出共两次,对每一个值为0的方格,所画线不能经过. 参考资料: <基于连通性状态压缩 ...
- HDU 1693 Eat the Trees
第一道(可能也是最后一道)插头dp.... 总算是领略了它的魅力... #include<iostream> #include<cstdio> #include<cstr ...
- 【HDU】1693 Eat the Trees
http://acm.hdu.edu.cn/showproblem.php?pid=1693 题意:n×m的棋盘求简单回路(可以多条)覆盖整个棋盘的方案,障碍格不许摆放.(n,m<=11) #i ...
随机推荐
- 控件动态产生器(使用RegisterClasses提前进行注册)
代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...
- MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
- java中path和classpath
Path 路径,是java编译时需要调用的程序(如java,javac等)所在的地方; CLASSPATH的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从class ...
- 【HDOJ】1706 The diameter of graph
这么个简单的题目居然没有人题解.floyd中计算数目,同时注意重边. /* 1706 */ #include <iostream> #include <string> #inc ...
- hadoop namenode启动过程详细剖析及瓶颈分析
NameNode中几个关键的数据结构 FSImage Namenode 会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有hdfs操 ...
- WPF编程学习——动画
前言 使用动画,是增强用户体验的一种有效的手段.合理的动画,可以让应用程序的界面看起来更加自然.真实.流畅.舒适,更有效地向用户展现信息,用户也更容易接受.同时也增加了软件使用的乐趣,提高用户粘度.( ...
- 将win7电脑变身WiFi热点
转自:http://bbs.feng.com/read-htm-tid-2167498.html 开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路 ...
- 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 ...
- [liu yanling]规范软件测试流程
测试计划 做任何事情都会有输入输出,对于测试过程我们可以把输入理解为测试计划.测试环境准备.测试工具的选择等等,输出可以理解为测试结果.测试用例设计即可以理解为以测试计划为输入的输出,也可以理解为以测 ...
- Redis和Memcache的对比
我这段时间在用redis,感觉挺方便的,但比较疑惑在选择内存数据库的时候到底什么时候选择redis,什么时候选择memcache,然后就查到下面对应的资料,是来自redis作者的说法(stackove ...