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

解题思路:

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

下面为代码

#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. 奇怪的JS

    有的时候发现JS是一门很高深的语言,不是我等俗人可以学会,没有private,没有public不说,居然连Class都没有,这个世界就是这样,有的东西你不一定非要想通,也不一定非要剖根问底,有的时候你 ...

  2. simplified build configuration

    http://blogs.msdn.com/b/saraford/archive/2005/08/16/452411.aspx Did you know… That you can hide the ...

  3. hadoop 序列化源码浅析

    1.Writable接口         Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可 ...

  4. Linux kernel ‘xfs_attrlist_by_handle()’函数缓冲区溢出漏洞

    漏洞名称: Linux kernel ‘xfs_attrlist_by_handle()’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-392 发布时间: 2013-11-29 更新 ...

  5. isIOS9

    function isIOS9() { //获取固件版本 var getOsv = function () { var reg = /OS ((\d+_?){2,3})\s/; if (navigat ...

  6. Xcode 不提示, 引用失效等情况

    在编写xcode的项目的时候出现过代码不高亮的症状,而且所有的warning都不再提示,include的内容也显示symbol not found,非常奇怪,解决方案如下: 方法一: 1.把.pch里 ...

  7. WCF中修改接口或步骤名称而不影响客户端程序

    WCF中修改接口或方法名称而不影响客户端程序 本篇接着"从Web Service和Remoting Service引出WCF服务"中有关WCF的部分. 运行宿主应用程序. 运行We ...

  8. JS正则表达式验证数字非常全

    <script type="text/javascript"> function validate(){ var reg = new RegExp("^[0- ...

  9. 看懂SqlServer查询计划

    看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...

  10. MVC View基础

    View主要用于呈现数据.由于Controller和相关的Service已经处理完业务逻辑并将结果打包成model实体,View只需要怎么去获得model并将其转为Html 1选择需要渲染的视图 在上 ...