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

这题是插头dp,刚刚学习,不是非常熟悉,研究了好几天才明确插头dp的方法,他们老是讲一些什么轮廓线啊,插头啊什么的,刚開始全然不知道这些事干什么的,看完cdq的大作后也是一头的雾水,看代码,绘图,一步一步的推,最终明确了,那个是为什么,这里讲一讲。

轮廓线表示的是当前插头的状态,这题中状态中1表示有插头,0表示无插头,假设是横线的话就是上面的格子与以下的格子相连的状态,这题中显然一个格子中要码有两个插头(经过这个格子),要码没有插头(不经过这个格子),由于不可能分叉走,每一个格子走一次。

这个状态表示(101111),当前决策格子是第二行第三个格子,显然它已经有了两个插头,也就是有1条线穿过它,所以不用再加插头了。

这个状态是(100111)和(101011),当前决策格子是第二行第三个格子,显然有一个插头了,再加入一个就可以,那么就有两个选择,要码向下,要码向右,就要有两个转移。

这个状态是(100011),当前决策格子是第二行第三个格子,显然之前没有有一个插头了,仅仅能加入两个,或者不加入,不加入,就肯定不经过这个格子,显然仅仅能这个格子是不可行的。

你自己推理一下,为什么要从i,j-1个格子中状态转移过来和上一层的状态转移到下层,你会发现轮廓线的美妙。

自己用笔画画吧,好记性不如烂笔头。

我參考的代码是 http://hi.baidu.com/fqq11679/blog/item/423bcd4a3d956bf983025c6d.html

只是状态转移上有点差别,他是当前状态转到后来状态,我是当前状态从前面转来。

//hdu1693  by huicpc0207
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=13;
const int M=(1<<N);
typedef long long LL;
LL dp[N][N][M];
int n,m,g[N][N],cas;
void read()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&g[i][j]);
}
void solve()
{
read();
memset(dp,0,sizeof dp);
dp[0][m][0]=1;
for(int i=1;i<=n;i++)
{
for(int k=0;k<(1<<m);++k)
dp[i][0][k<<1]=dp[i-1][m][k];
for(int j=1;j<=m;j++)
for(int k=0;k<(1<<m+1);k++)
{
int x=1<<j-1;
int y=1<<j;
if(g[i][j]==0)
{
if((k&x)==0&&(k&y)==0) dp[i][j][k]=dp[i][j-1][k];
else dp[i][j][k]=0;
}
else{
if((k&x)!=0&&(k&y)!=0)
dp[i][j][k]=dp[i][j-1][k^x^y];
else if((k&x)==0&&(k&y)==0)
dp[i][j][k]=dp[i][j-1][k^x^y];
else
dp[i][j][k]=dp[i][j-1][k]+dp[i][j-1][k^x^y];
}
// printf()
}
}
printf("Case %d: There are %I64d ways to eat the trees.\n",++cas,dp[n][m][0]);
}
int main()
{
// freopen("1.in","r",stdin);
int t; cas=0;
scanf("%d",&t);
while(t--) solve();
return 0;
}

hdu1693插头dp(多回路)的更多相关文章

  1. hdu1693 插头dp

    题意:给了一个矩阵图,要求使用回路把图中的树全部吃掉的方案树,没有树的点不能走,吃完了这个点也就没有了,走到哪吃到哪 用插头dp搞 #include <iostream> #include ...

  2. HDU 4285 circuits( 插头dp , k回路 )

    circuits Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. Ural 1519 Formula 1 插头DP

    这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连 ...

  4. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  5. HDU1693 Eat the Trees 插头dp

    原文链接http://www.cnblogs.com/zhouzhendong/p/8433484.html 题目传送门 - HDU1693 题意概括 多回路经过所有格子的方案数. 做法 最基础的插头 ...

  6. hdu1693 Eat the Trees 【插头dp】

    题目链接 hdu1693 题解 插头\(dp\) 特点:范围小,网格图,连通性 轮廓线:已决策点和未决策点的分界线 插头:存在于网格之间,表示着网格建的信息,此题中表示两个网格间是否连边 状态表示:当 ...

  7. HDU1693 Eat the Trees —— 插头DP

    题目链接:https://vjudge.net/problem/HDU-1693 Eat the Trees Time Limit: 4000/2000 MS (Java/Others)    Mem ...

  8. hdu1693:eat trees(插头dp)

    题目大意: 题目背景竟然是dota!屠夫打到大后期就没用了,,只能去吃树! 给一个n*m的地图,有些格子是不可到达的,要把所有可到达的格子的树都吃完,并且要走回路,求方案数 题解: 这题大概是最简单的 ...

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

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

随机推荐

  1. POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)

    依据题意可构造出方程组.方程组的每一个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = ...

  2. C#基础数据类型与字节数组(内存中的数据格式)相互转换(BitConverter 类)

      在某种通讯协议中(如 Modbus),可能需要把一些基本的数据类型内存中的表示形式转换成以字节数组的形式,方便传送.C/C++中可以利用指针等操作完成,但C#中没有指针,咋办呢?可以用BitCon ...

  3. 1.4 Python基础知识 - 代码书写格式及条件判断"if ... else ..."

    一.代码的书写规则 在所有的开发语言中,代码之间都是有关联的关系,有的是包含关系,有的是上下级关系,有的是代表语句的结束.在python中也是有相应的规则的: 1.在没有上下级关系的代码中,代码要顶行 ...

  4. 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs

    [链接] 我是链接,点我呀:) [题意] 给你一个规则,让你知道第i根萝卜的高度为si = A+(i-1)*B 现在给你n个询问; 每次询问给你一个固定的起点l; 让你找一个最大的右端点r; 使得l. ...

  5. [React] Close the menu component when click outside the menu

    Most of the time, your components respond to events that occur within the component tree by defining ...

  6. HDU 1556 Color the ball【算法的优化】

    /* 解题思路:每次仅仅求解一開始的第一个数字,让第一个数字加一,最后的一个数字的后面一个数减一.我们能够想想,最后加的时候,就是加上前面一个数出现的次数和自己本身出现的次数. 解题人:lingnic ...

  7. 基于Qt Assistant制作软件帮助文档

    Qt Assistant是Qt自带的一款可定制.可重新发行的帮助文件浏览器.Qt Assistant支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器.关于Qt Assistant定制 ...

  8. TCP的可靠传输机制(简单好理解:分段与流,滑窗,连接,流量控制,重新发送,堵塞控制)

    TCP的几大模块:分段与流,滑窗,连接,流量控制,重新发送,堵塞控制. 1.checksum:在发送TCP报文的时候,里面的信息可能会因为环境的问题,发送变化,这时,接收信号的时候就需要通过check ...

  9. Spring Boot 静态资源处理(转)

    Spring Boot 静态资源处理 Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Bo ...

  10. 使用DNSCrypt解决Dropbox污染问题

     作者:半点闲 时间:2014-6-27 18:27 博客:blog.csdn.net/cg_i 邮箱:b_dx@sohu.com 背景知识:防火长城(GFW) keyword:DNSCrypt ...