【Luogu】P3565HOT-Hotels(树形DP)】的更多相关文章

题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察题目,我们把这道题转换一下:给定一颗树,选出包含1号节点(根)的一颗子树,使得点权和最大. 我们可以这样子定义状态: 设f[i][j] 表示以i为根节点的子树,选出j个节点,所能达到的最大点权值. 对于二叉树来说,转移很显然,就是枚举左子树分配多少个节点,就可以对应的得出右子树能分配到多少个节点,对…
题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i(a); i <= (b); ++i) #define for_edge(i, x) for(int i = H[x]; i; i = X[i]) int n, x, y,…
题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求出一颗树上的最大联通子图. 因为我们是在树上取的,实际上就是取一颗子树. 这个就是最基础的树形DP模型了. 我们可以设f[i]表示我们选的子图以i为根所能取的子树的最大值. 转移是: f[i] = beauty[i] + xigema(max(f[j],0)) (也就是一颗树的孩子所能取的子树,如果…
本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了.所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数. 输入输出格式 输入格式: 第一行一个整数N.(1<=N<=600…
题目链接 这题好神啊…… 设f[i]为i没电的概率,初始化$f[i]=1-q[i]$ 之后x的电有三个来源: 1.x自己有电 2.x的儿子给它传来了电 3.x的父亲给它传来了电 对于2和3操作分别做一次树形DP,第一次是用儿子推出父亲,第二次是用父亲推出儿子. #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #include<cstdlib> #def…
题目链接 水题,时限放得非常宽,暴力DP随便套上一波register就能卡过去. 唯一的遗憾是5A. 树形DP,s[i][j]表示以i为根的子树里距i的距离%3=j的点数,f[i]表示i为根的子树内一共有多少满足条件的点对. 两重循环暴力枚举i的所有儿子,暴力转移加波register即可. 据说正解是点分治,并不会.回头学学吧(挖坑). #include<cstdio> #include<cstring> #include<cctype> #include<alg…
题目链接 树形DP水题,设f[x][0]是以x为根的子树,内部只有半条链(就是链的两个端点一个在子树里,一个不在子树里)的最大值,f[x][1]是以x为根的子树,内部有一条完整的链(选两个内部的子树作为链的左端点和右端点)的最大值. 于是可以很轻松的得出DP方程: 一开始f[x][0]=f[x][1]=1 然后dfs,深搜x的子树,记录一下x有多少子节点的同时记录子树的最大半链和次大半链(用来在转移的时候凑成x子树内的整个链).最后注意细节乱搞搞就行了. 本题不考思维但是比较考验考虑细节的能力.…
题目链接 水了半个月之后Fd终于开始做题啦! 然后成功的发现自己什么都不会了 树形DP,既然是三个点两两距离相等那一定得有个中心点吧,枚举那个中心点,然后暴力DFS,根据乘法原理算. 乘法原理就是我一个子树,距离为i的选择情况增加tot[i],两个子树的话是一个子树的选择情况乘上tot[i],三个子树(就是答案)就是两个子树的选择情况乘上tot[i]; 挺暴力的……不过貌似POI能过了 据说有个加强版100000数据范围,要什么长链剖分……记一下以后来填坑 #include<cstdio> #…
题目链接 树形DP,设f[i][j]是当前在i点,j步之内有多少牛.从相邻点to的f[to][j-1]转移而来,减去重复计算即可. #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<cstdlib> #define maxn 150020 #define maxk 22 using namespace std; inline long…
题目链接 树形DP水题qwq. 设f[i][j]是以i为根的子树,染成j色,且满足内部需求的最少染色节点数. 设to是x的子节点,那么状态转移方程如此设计: 1.f[i][0] 这个状态表示i不染色,那显然很好办,对于每个to从f[to][1],f[to][2]和f[to][0]里选一个最小的即可. 转移方程$f[x][0]=\sum\limits_{to}min(f[to][1],f[to][2],f[to][0])$ 2.f[i][1] 此时i染成黑色.那么对于每个to我们发现,既可以让它继…