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 ...
随机推荐
- iCloud 包括文稿与数据、日历、提醒事项、 通讯录、备忘录、Safari书签
iCloud 能够为用户在设备间同步数据和在服务器上保存数据.当前 iCloud 包括文稿与数据.日历.提醒事项. 通讯录.备忘录.Safari书签.阅读列表.iCloud Tabs.iBooks书签 ...
- Linux伙伴系统1
(一)--伙伴系统的概述 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生.Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先 ...
- vc:如何从Internet上有效而稳定地下载文件
http://www.vckbase.com/index.php/wv/172 如何从Internet上有效而稳定地下载文件 ,这是很多网络应用程序要考虑的重要问题,本文提供的代码段针对这个问题进行了 ...
- hdu4432 Sum of divisors(数论)
Sum of divisors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- poj2723
把每对钥匙看做一个变量,那两个钥匙看做他的两个状态 每一个开门的要求就是一个条件(xi or xj) 很显然有了2sat的基本要素 2sat是一个判定性问题,而这题求最多能过几个门: 不难想到二分答案 ...
- BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1221 n天,每天需要r个毛巾,用完以后可以洗,要么花fa洗a天,要么花fb洗b天,毛巾不够了可 ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
- 编写一个jsp页面,输出九九乘法表。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- [转]NHibernate之旅(13):初探立即加载机制
本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制——延迟加载.其本质就是使用GoF23中代理模式 ...
- cocos2d-x ios8 输入框显示bug
https://github.com/cocos2d/cocos2d-x/pull/8149