【BZOJ3522】[Poi2014]Hotel 树形DP
【BZOJ3522】[Poi2014]Hotel
Description
有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达。吉丽要给他的三个妹子各开(一个)房(间)。三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽满意,你需要让三个房间两两距离相同。
有多少种方案能让吉丽满意?
Input
第一行一个数n。
接下来n-1行,每行两个数x,y,表示x和y之间有一条边相连。
Output
让吉丽满意的方案数。
Sample Input
1 2
5 7
2 5
2 3
5 6
4 5
Sample Output
HINT
【样例解释】
{1,3,5},{2,4,6},{2,4,7},{2,6,7},{4,6,7}
【数据范围】
n≤5000
题解:由于可以O(n^2)搞,很容易想到枚举中间点(树根),然后用树形DP搞一搞
发现三个妹子一定在根的三个不同儿子的子树中,所以我们可以遍历根的每个儿子,设s[i]表示其中一个儿子的子树中,深度为i的点有多少个,然后设f[i][j]表示在j个不同儿子的子树中,各选出一个深度为i的点的方案数,可以得到下面的式子
f[i][j]+=f[i][j-1]*s[i]
注意f[0][..]要赋成0,并且j要从3到1循环(01背包的思想)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=5010;
int n,cnt;
long long ans;
int to[maxn<<1],next[maxn<<1],head[maxn],dep[maxn];
long long s[maxn],f[4][maxn];
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x,int fa)
{
int i;
s[dep[x]]++;
for(i=head[x];i!=-1;i=next[i])
{
if(to[i]==fa) continue;
dep[to[i]]=dep[x]+1,dfs(to[i],x);
}
}
int main()
{
scanf("%d",&n);
int i,j,k,l,a,b;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
for(i=1;i<=n;i++)
{
memset(f,0,sizeof(f));
for(k=1;k<=n;k++) f[0][k]=1;
for(j=head[i];j!=-1;j=next[j])
{
memset(s,0,sizeof(s));
dep[to[j]]=1,dfs(to[j],i);
for(l=3;l>=1;l--)
for(k=1;s[k];k++)
f[l][k]+=f[l-1][k]*s[k];
}
for(k=1;f[3][k];k++) ans+=f[3][k];
}
printf("%lld",ans);
return 0;
}
【BZOJ3522】[Poi2014]Hotel 树形DP的更多相关文章
- BZOJ3522[Poi2014]Hotel——树形DP
题目描述 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽 ...
- 3522: [Poi2014]Hotel( 树形dp )
枚举中点x( 即选出的三个点 a , b , c 满足 dist( x , a ) = dist( x , b ) = dist( x , c ) ) , 然后以 x 为 root 做 dfs , 显 ...
- 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并
题目大意 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) \(1\leq n\leq 1 ...
- BZOJ3522: [Poi2014]Hotel
3522: [Poi2014]Hotel Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 195 Solved: 85[Submit][Status] ...
- bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心
题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ...
- BZOJ3522 [Poi2014]Hotel 【树形dp】
题目链接 BZOJ3522 题解 就是询问每个点来自不同子树离它等距的三个点的个数 数据支持\(O(n^2)\),可以对每个距离分开做 设\(f[i][j]\)表示\(i\)的子树中到\(i\)距离为 ...
- [POI2014]FAR-FarmCraft 树形DP + 贪心思想
(感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...
- 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
[BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are houses connected ...
- BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)
题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...
随机推荐
- 转:maven3常用POM属性及Settings属性介绍
原文:http://blog.csdn.net/lgm277531070/article/details/6922645 A.pom.xml属性介绍: project: pom的xml根元素. par ...
- Servlet容器 Jetty
http://www.oschina.net/p/jettyJetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境.Jetty是使用Java语 ...
- Android第三方推送引擎比较
所了解的第三方推送引擎有极光推送(JPush), 百度, 个推,腾讯信鸽等.根据了解,最专业的据说是极光推送,先看极光推送. 一.极光推送 https://www.jpush.cn/ 配置: 1.JP ...
- Android横竖屏布局总结
Android横竖屏要解决的问题应该就两个:一.布局问题;二.重新载入问题. 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你 ...
- NoSQL(二)
redis介绍 1.aof存储的文件会越来越大,当文件很大时我们可以进行一次rdb存储原来的aof文件就可以删除了,因为aof就相当与mysql中的binlog文件会一致增长,当redis里面的key ...
- 171. Anagrams【medium】
Given an array of strings, return all groups of strings that are anagrams. Notice All inputs will be ...
- 413. Reverse Integer【easy】
Reverse digits of an integer. Returns 0 when the reversed integer overflows (signed 32-bit integer). ...
- 李洪强总结KVC用法
- form在submit之前使用request.setCharacterEncoding是没用的
点击了submit按钮,就创建了另一个request了 比如你有a.jsp,上面有个form,form的action指向某个Servlet或者Action,那么你在a.jsp页面上写的request. ...
- Java 编程
1,Java实体如果复写构造方法,一定要显式指定默认构造方法 2,集合初始化下面这种方法不可取 因为双括号初始化(DBI)创建了一个匿名类,该类引用了拥有对象的实例,如果匿名内部类被其他对象返回并持有 ...