
树形DP
林黛玉倒拔垂杨柳
你我最后也平凡到自命不凡
展开
-
动态规划 背包九讲 有依赖的背包问题 (树形DP)
有依赖的背包问题 有 N 个物品和一个容量是 V 的背包。 物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点,根节点为-1 。 每件物品的编号是 i,体积是 vi,价值是 wi,依赖的父节点编号是 pi。物品的下标范围是 1…N。 求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行有两个整数 N,V,用空格隔开,分别表示物品个数和背包容量。 接下来有 N 行数据,每行数据表示一个物品。 第 i 行有三个整数 vi,w原创 2020-09-01 09:58:23 · 938 阅读 · 0 评论 -
AcWing-846 数的重心 (树形dp)
树的重心 题目大意: 给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。 Code: #include<iostream> #include<vector> #include<algorithm> using namespace std; const int maxn=1e5原创 2020-08-28 21:40:34 · 175 阅读 · 0 评论 -
HDU2196- Computer (树形DP/ 树上点可到的最远距离)
Computer 题目大意: 就是求树上每个点可到的最远距离,(不是树的直径)是单向可走的最远距离。 解题思路: 虽然不是树的直径但是也和树的直径有着一定的关系,在树形dp求树的直径中,f数组求的是该节点到子树的最远距离,这里我们也用到了这个东西。不过我们又新建了两个数组。 dp[i][0] 表示以 i 为根的子树上的节点到 i 的最长距离。 //之前的f数组 dp[i][1] 表示以 i 为根的子树上的节点到 i 的次长距离。 dp[i][2] 表示从 i 向父亲节点能走的最长距离。 //第二次dfs解原创 2020-08-10 21:24:57 · 344 阅读 · 0 评论 -
CodeForces - 1118F1 Tree Cutting (Easy Version) (树形dp/dfs+思维)
Tree Cutting (Easy Version) 题目大意: 有一颗树,每个节点有三种颜色,红蓝或者无色,问你怎样分割可以把树分成两半并且红色还有蓝色分别位于两边。 解题思路: 首先我们先记录一下红蓝节点分别有多少个,然后跑一遍dfs记录每个节点的子树上的红蓝节点的个数,最后遍历一下,如果红色节点=x蓝色 =0,或者红色=0蓝色=y,ans++即可 Code: #include <iostream> #include <cstdio> #include<cmath>原创 2020-08-09 11:59:38 · 259 阅读 · 0 评论 -
codeforces 1083 A. The Fair Nut and the Best Path(树形dp)
题目大意: 每个节点都给定一个值a[i],从一个节点走到另一个节点会消耗固定值w,但也会得到这个节点的价值,问怎样走才能得到最大的价值。 解题思路: 这个题和树形dp求树的直径差不多(树形DP基本都是相通的),f[X] 代表以x点为根节点,到子树叶子点可以获得的最大权值 Code: #include <iostream> #include <cstdio> #include<cmath> #include <cstring> #include <algo原创 2020-08-09 11:11:41 · 186 阅读 · 0 评论 -
剑指offer: [POJ]2631 The Fair Nut and the Best Path 树形DP的方式求解树的直径
题目大意: 树上有村子,求最远两个村子的距离 解题思路:很显然这是一个裸的树的直径,有很多种方法可以求解,这些写一下树形DP的解法 首先定义一个F数组,f[x]的含义是以x点为根节点,到最远的子树叶子点距离,然后每个点都跑一遍即可。 Code: #include <bits/stdc++.h> typedef long long ll; using namespace std; const int N=10010; struct node { int v,w; node() {}; no原创 2020-08-09 09:53:51 · 193 阅读 · 0 评论