树型DP
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
Weight the Tree CodeForces - 1646D
http://codeforces.com/contest/1646/problem/D在“好”点不能相邻的条件下,使“好”点的数量最多,典型树型DP。在使“好”点的数量最多的条件下,使权重最小(非“好”点权重为1,“好”点权重为邻接点权重之和),也可按树型DP处理。#include <bits/stdc++.h>using namespace std;const int maxn=2e5+10;struct node{ int v,tp,next;};no原创 2022-03-05 18:50:22 · 290 阅读 · 1 评论 -
Bear and Tree Jumps CodeForces - 791D
http://codeforces.com/problemset/problem/791/D想了好久也没啥思路 看题解恍然大悟首先要转换思路 正面考虑死路一条 自己还揪着不放。。当k为1时就是个裸题 就是算一下每条边的左右两边各有多少点 可得每条边走了多少次假设在本题中任意两点之间的距离都是k的倍数 没有向上取整 那按上面的方法算完贡献除k即可 除k是因为这里可以一步迈k条边...原创 2019-04-24 19:21:51 · 248 阅读 · 0 评论 -
Apple Tree CodeForces - 349D
http://codeforces.com/problemset/problem/349/D对于u来说 要使其子节点v1 v2...vk的苹果数都相等 肯定不能简单把所有节点都置为最小值 因为对于u的子节点也要满足子树苹果数相等 假设v1 v2...vk这几棵子树每次最少要拿掉多少苹果才能使自己的子树平衡是已知的 显然u一次拿多少就是v1 v2...vk的lcm了因为要使每个节点都满足所有...原创 2019-04-24 09:34:58 · 139 阅读 · 0 评论 -
幸运树 51Nod - 1588
https://www.51nod.com/Challenge/Problem.html#!#problemId=1588用并查集维护非幸运边构成的连通块大小cnt[i] 然后用幸运边建图枚举每个连通块 算以该连通块中的点为中点(即三元组中的i)时有多少可能 剩下的两个点(即三元组中的jk)从n-cnt[i]中任选两个 因为有顺序 乘二即可#include <bits/s...原创 2019-05-03 16:36:16 · 230 阅读 · 0 评论 -
Zero Tree CodeForces - 275D
http://codeforces.com/problemset/problem/275/Dminn[i]代表以i为根的子树要变零树要减几次 maxx[i]是加几次 最后汇总至根节点输出maxx[1]-minn[1]即可#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll...原创 2019-04-23 21:20:36 · 231 阅读 · 0 评论 -
Party at Hali-Bula UVA - 1220
https://cn.vjudge.net/problem/UVA-1220求最大独立集就是裸题 主要是判唯一dp[i][0]代表不选i的最大独立集 dp[i][1]代表选ibook[i][0]代表不选i是否唯一 book[i][1]代表选ibook[i][0]是不唯一解的贡献者 当i的子节点j出现dp[j][0]==dp[j][1]时 选谁都可以 这时不选i会产生不唯一解b...原创 2019-05-03 14:31:27 · 177 阅读 · 0 评论 -
保安站岗 洛谷 - P2458
https://www.luogu.org/problemnew/show/P2458一开始想当然用两种状态dp[i][0]代表i不站人dp[i][1]代表i站人。。 这样每隔一层必站一个人 肯定不对 当u的儿子v站人后 只通过两种状态不能完全体现v对u的监视作用 即u的父亲f不知道u是否还需要保护 只要u不站人就会觉得u需要保护 从而无法做出正确决定比如下面这个样例41 1 1 ...原创 2019-05-03 13:20:41 · 213 阅读 · 0 评论 -
Serval and Rooted Tree CodeForces - 1153D
http://codeforces.com/problemset/problem/1153/D遍历到第i个节点时 假设以i为根的子树上有sum[i]个叶子节点 就只考虑1到sum[i]这些数对i节点的贡献 dp[i]即为此时的最大值dp[i]是从其子节点转移而来 假设i是min型 min从dp[j1] dp[j2]...得来为 使min最大 就把1到sum[i]中最小的一些数都填到(dp[...原创 2019-04-23 12:34:56 · 128 阅读 · 0 评论 -
有线电视网 洛谷 - P1273
https://www.luogu.org/problemnew/show/P1273只能想到n^3的办法 一看数据量自闭了。。 看了题解也是n^3 智障出题人dp[i][j]代表以i为根的子树选j个用户时得到的最大收益 然后就是树上背包转移一下 最后看根节点上最多选几个人不亏本#include <cstdio>#include <cstring>#...原创 2019-04-22 21:12:26 · 207 阅读 · 0 评论 -
重建道路 洛谷 - P1272
https://www.luogu.org/problemnew/show/P1272dp[cur][i]代表对以cur为根的子树删去i个点的最小代价 当cur的所有子节点v的信息(即dp[v][i])已知后 就是一个背包问题 容量就是cur子树的大小 每件物品的重量就是i 价值就是dp[v][i] 注意这里是分组背包 即每棵子树一个组 对每棵子树只能选一件物品#include &...原创 2019-04-22 19:17:14 · 131 阅读 · 0 评论 -
Garland CodeForces - 767C
http://codeforces.com/problemset/problem/767/C找两个除根节点之外的点 将整棵树分为权值相等的三部分两个点的关系 要么lca是两者其中一个 要么不是对于第一种情况 在dfs时用栈保存权值为(2/3*tot)的点 如果遍历到某个权值为(1/3*tot)的点时战非空 则找到答案对于第二种情况 对于遍历到的每棵子树 看它有多少棵子树含有权值为(...原创 2019-04-22 09:40:42 · 187 阅读 · 0 评论 -
The more, The Better HDU - 1561
http://acm.hdu.edu.cn/showproblem.php?pid=1561先正向拓扑去掉无法到达的点 然后用剩下的点建一正一反两个图然后逆向拓扑 当某点因度数为0而入队列时 说明正向图中他的所有后继节点(即从该点进行BFS能到达的所有点)都已遍历 这和树型DP的思想一样 只不过这里需要考虑的拓扑序稍复杂一些这时可以想到利用01分组背包的思想 dp[i][j]代表从第i...原创 2019-04-16 22:17:48 · 252 阅读 · 0 评论 -
最优连通子集 POJ - 1192
poj.org/problem?id=1192求最大子树权值 和最大子段和类似的思路 先枚举树根 dp[i]代表此时以i为根的最大子树权值 若为正值则加到其父亲身上 否则舍弃智障。。 其实不需要换根 在计算完每棵子树的最大和后更新一下答案即可 这时的答案并不代表以当前遍历到的节点为根 而只是在以当前遍历到的节点为根的子树范围内的最大子树和#include <cstd...原创 2019-04-17 09:05:03 · 171 阅读 · 0 评论 -
Edge to the Root ZOJ - 3949
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3949容易发现 当连接位置改变时 受影响的点只有u与u到根的中点之间的所有点当从根连边到u时答案记为pre[u] 若移向u的子节点v 此时的pre[v]=pre[u]+sum[mid]-2*sum[u] 其中找mid可以用倍增 但是看到有更好的方法 就是利用树上递归的...原创 2019-04-09 12:36:20 · 113 阅读 · 0 评论 -
Rebuilding Roads POJ - 1947
http://poj.org/problem?id=1947dp[i][j]代表以i为根的子树 保留j个节点最少需要删几条边详见注释#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=0x3f3f3f3f;const ...原创 2019-03-21 16:33:08 · 162 阅读 · 0 评论 -
Anniversary party POJ - 2342
点击打开链接第一道树形dp题目 虽然a了 但理解还是不到位补坑 dp[i][0]代表节点i不去舞会时整棵子树最大欢愉度 dp[i][1]相反 当前节点从所有子节点转移过来即可 因为兄弟节点之间是互不相干的转移方程 dp[i][0]+=max(dp[j][0],dp[j][1]) dp[i][1]+=dp[j][0] 其中dp[i][0]+=max(dp[j][0],dp[j][1...原创 2017-10-02 14:40:13 · 160 阅读 · 0 评论