题意:在n*m的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少中方法。

第一道真正意义上的插头DP,可参考陈丹琦的《基于连通性状态压缩的动态规划问题》,虽然我看了一遍,但只是了解了个大概,主要还是看别人的代码,自己画图理解。

插头和轮廓线的定义就不说了,在PPT中很好理解。

先说一下转移的方式,如下图(p和q是当前枚举到的格子所面临的需要更新插头的地方):

通过在纸上画图,可以得出这么几个结论:

前一个状态的q和p都有插头的话,后一个状态的q和p都不能有插头。(因为一个显然格子只能有两个插头)

前一个状态的q和p都没有插头的话,后一个状态的q和p都必须有插头。(因为每个格子必须经过)

前一个状态的q和p任何一个有插头,后一个状态的q和p中只有一个有插头。

得到这几个结论之后,就可以方便地转移了。

最后在代码中有一点要注意的是,上一行的最后一列的状态可以转移到下一行第0列的状态,原因如下图:

代码参考于:http://www.cnblogs.com/zhuangli/archive/2008/09/04/1283753.html

#include<cstdio>
#include<iostream>
#include<cstring>
#define N 12
using namespace std;
int map[N][N],n,m;
long long dp[N][N][<<N];
int main(){
int T,cas=;scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&map[i][j]);
memset(dp,,sizeof(dp));
dp[][m][]=;
for(int i=;i<=n;i++){
for(int j=;j<(<<m);j++)
dp[i][][j<<]=dp[i-][m][j];
for(int j=;j<=m;j++){
for(int k=;k<(<<m<<);k++){
int p=<<j;
int q=p>>;
bool x=k&p;
bool y=k&q;
if(map[i][j]){
dp[i][j][k]+=dp[i][j-][k^p^q];
if(x!=y)
dp[i][j][k]+=dp[i][j-][k];
}
else {
if(x==&&y==)
dp[i][j][k]=dp[i][j-][k];
else
dp[i][j][k]=;
}
}
}
}
printf("Case %d: There are %I64d ways to eat the trees.\n",++cas,dp[n][m][]);
}
return ;
}

Eat the Trees(hdu 1693)的更多相关文章

  1. 【HDU1693】Eat the Trees(插头dp)

    [HDU1693]Eat the Trees(插头dp) 题面 HDU Vjudge 大概就是网格图上有些点不能走,现在要找到若干条不相交的哈密顿回路使得所有格子都恰好被走过一遍. 题解 这题的弱化版 ...

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

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

  3. HDU1693 Eat the Trees(zerojudge a228)

    传送门: https://zerojudge.tw/ShowProblem?problemid=a228 http://acm.hdu.edu.cn/showproblem.php?pid=1693 ...

  4. 2019.01.23 hdu1693 Eat the Trees(轮廓线dp)

    传送门 题意简述:给一个有障碍的网格图,问用若干个不相交的回路覆盖所有非障碍格子的方案数. 思路:轮廓线dpdpdp的模板题. 同样是讨论插头的情况,只不过没有前一道题复杂,不懂的看代码吧. 代码: ...

  5. [Hdu1693]Eat the Trees(插头DP)

    Description 题意:在n*m(1<=N, M<=11 )的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法. Solution 插头DP ...

  6. 2道acm编程题(2014):1.编写一个浏览器输入输出(hdu acm1088);2.encoding(hdu1020)

    //1088(参考博客:http://blog.csdn.net/libin56842/article/details/8950688)//1.编写一个浏览器输入输出(hdu acm1088)://思 ...

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

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

  8. 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 ...

  9. HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1134 [解题背景]这题不会做,自己推公式推了一段时间,将n=3和n=4的情况列出来了,只发现第n项与 ...

随机推荐

  1. oc数组遍历

    #import <Foundation/Foundation.h> //数组遍历(枚举)对集合中的元素依此不重复的进行遍历 int main(int argc, const char * ...

  2. vscode wepy 用户自定义代码片段

    VSCode wepy 自定义代码片段 { "wepy-page": { "prefix": "wepy", "body" ...

  3. 螺旋矩阵,两步进阶,从暴力到o(1)

    题目描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格 ...

  4. BZOJ3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(dp)

    题意     约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K( ...

  5. EasyUI取消树节点选中

    $('#organTree').find('.tree-node-selected').removeClass('tree-node-selected'); 取消树的节点选中

  6. java--creater in windows

    电脑右键--高级--属性--更改环境变量 1.JAVA_HOME  C:\Program Files\Java\jdk1.7.0_04 2. Path                     %JAV ...

  7. 二十二、MySQL 正则表达式

    MySQL 正则表达式 在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配. MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正 ...

  8. Java最小堆解决TopK问题

    TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...

  9. Diycode开源项目 Glide图片加载分析

    1.使用Glide前的准备 1.1.首先要build.gradle中添加   github原地址点击我. 参考博客:Glide-开始! 参考博客:android图片加载库Glide的使用介绍. 参考博 ...

  10. qt4.8.5 qtwebkit 静态编译 版本

    2013年就编译好了,qtwebkit是最不好编译的了,尤其是静态编译,这儿分享给大家 估计总有人会用得到... 静态库下载地址:http://yunpan.cn/cyyNqrApbVDwq  提取码 ...