首页 > TAG信息列表 > P2015

洛谷P2015 二叉苹果树

题意: 数有\(N\)个节点,根编号为\(1\),一根树枝连接两个编号,树枝上有一定数量的苹果,给定需要保留的边数,求最多能留住多少苹果。 思路: 树形\(DP\) + 有依赖的背包问题 看成有依赖的背包问题:f[u][j]就表示以\(u\)为根节点的子树,选\(j\)条边的最大价值。 那么转移方程:\(f[u][j] = max(f[

洛谷P2015—二叉苹果树(树形DP)

题意 有n个结点,树枝上有苹果,需要保留一些树枝,问最多能留下多少苹果? 输入输出 输入:第一行 2个整数 N 和 Q,分别表示表示树的结点数,和要保留的树枝数量。 接下来 N-1 行,每行 3 个整数,描述一根树枝的信息:前 2 个数是它连接的结点的编号,第 3 个数是这根树枝上苹果的数量。 输出:一个数,最

P2015 二叉苹果树

传送门 一道树形dp入门题,先放代码后面补。 #include <bits/stdc++.h> using namespace std; const int N = 210; int head[N], tot, dp[N][N]; struct Edge{ int v, w, next; }edge[N]; int n, q; void add(int u, int v, int w){ edge[tot].v = v; edge[tot].w = w; edge[to

【SSL_1605】&【lg_P2015】二叉苹果树

题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树 2 5 \ / 3 4 \ / 1

P2015 二叉苹果树

状态表示: \(dp[u][j]\):表示以结点u为根的子树上留j条边时的最多苹果数量。 状态转移: 状态转移方程如何设计?下面给出2种思路,二叉树方法、多叉树(一般性)方法。 (1)二叉树 本题是一棵二叉树,根据二叉树的特征,考虑u的左右子树,如果左子树\(l\)共留\(k\)条边(不包含\(u \rightarrow l\)这条边

洛谷 P2015 二叉苹果树 题解

题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); #include <bits/stdc++.h>using namespace std;struct littlestar{ int to; int nxt; int w;}star[2010];int head[2010],cnt;void add(i

P2015 二叉苹果树

题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树 2 5 \ / 3 4 \ / 1 现在这颗树

【P2015】二叉苹果树 (树形DP分组背包)

题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。 给定需要保留的树枝数量,求出最多能留住多少苹果。 输入输出格式 输入格

洛谷 P2015 二叉苹果树 (树上背包)

洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包。 首先,定义状态\(dp[x][i]\)表示在节点\(x\)保留\(i\)个边所获得的最大苹果数,定义状态时一定要选对状态并且定义清晰