洛谷 P2015 二叉苹果树 (树上背包)
洛谷 P2015 二叉苹果树 (树上背包)
一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包。
首先,定义状态\(dp[x][i]\)表示在节点\(x\)保留\(i\)个边所获得的最大苹果数,定义状态时一定要选对状态并且定义清晰(状态中包括了当前节点吗?目标状态是怎样的?)。一开始我就是因为状态定义错误,所以卡了半天,之后重新定义状态后几分钟就切了这道题。
然后是普通的树上背包状态转移
\]
注意,此次已优化了一维,所以\(i\)要降序遍历。
AC Code:
#include <cstdio>
#include <vector>
#define MAXN 110
#define MAX(A,B) ((A)>(B)?(A):(B))
#define MIN(A,B) ((A)<(B)?(A):(B))
using namespace std;
int n,q,dp[MAXN][MAXN];
struct nod{
int v, val;
nod(int v, int val):v(v),val(val){}
};
vector <nod> mp[MAXN];
int dfs(int x, int fa){
int cnt=1,sz=0;
for(register int i=0;i<mp[x].size();++i){
int v=mp[x][i].v,val=mp[x][i].val;
if(fa==v) continue;
sz=dfs(v, x);
cnt+=sz;
for(register int j=q;j>=0;--j)
for(register int k=1;k<=MIN(sz, j);++k)
dp[x][j]=MAX(dp[x][j], dp[v][k-1]+dp[x][j-k]+val);
}
return cnt;
}
int main()
{
scanf("%d %d", &n, &q);n--;
while(n--){
int a,b,val;
scanf("%d %d %d", &a, &b, &val);
mp[a].push_back(nod(b, val));
mp[b].push_back(nod(a, val));
}
dfs(1,0);
printf("%d", dp[1][q]);
return 0;
}
/*
dp[x][i]=MAX(dp[x][i], dp[x][i-k]+dp[son_x][k-1]+val)
*/
洛谷 P2015 二叉苹果树 (树上背包)的更多相关文章
- 洛谷p2015二叉苹果树&yzoj1856多叉苹果树题解
二叉 多叉 有一棵苹果树,如果树枝有分叉,可以是分多叉,分叉数k>=0(就是说儿子的结点数大于等于0)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1~N,树根编号一定是1.我们用一根树枝两 ...
- 洛谷 P2015 二叉苹果树 && caioj1107 树形动态规划(TreeDP)2:二叉苹果树
这道题一开始是按照caioj上面的方法写的 (1)存储二叉树用结构体,记录左儿子和右儿子 (2)把边上的权值转化到点上,离根远的点上 (3)用记忆化搜索,枚举左右节点分别有多少个点,去递归 这种写法有 ...
- 洛谷 P2015 二叉苹果树(codevs5565) 树形dp入门
dp这一方面的题我都不是很会,所以来练(xue)习(xi),大概把这题弄懂了. 树形dp就是在原本线性上dp改成了在 '树' 这个数据结构上dp. 一般来说,树形dp利用dfs在回溯时进行更新,使用儿 ...
- 洛谷 P2015 二叉苹果树 题解
题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); #include ...
- 洛谷 P2015 二叉苹果树
老规矩,先放题面 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端 ...
- 洛谷P2015 二叉苹果树
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
- 洛谷—— P2015 二叉苹果树
https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...
- 洛谷P2015 二叉苹果树(树状dp)
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
- 洛谷P2015二叉苹果树
传送门啦 树形 $ dp $ 入门题,学树形 $ dp $ 的话,可以考虑先做这个题. $ f[i][j] $ 表示在 $ i $ 这棵子树中选 $ j $ 个苹果的最大价值. include #in ...
随机推荐
- numpy中tile()函数
函数形式: tile(A,rep) 功能:重复A的各个维度 参数类型: - A: Array类的都可以,即A是一个ndarry数组- rep:A沿着各个维度重复的次数,表示变成的矩阵的形状,例如rep ...
- java消息中间件的使用与简介
一.为什么要使用消息中间件 消息中间件就是可以省去繁琐的步骤,直达目的,怎么讲呢,就是比如你想很多人,知道你的动态,而知道的人可能手机没电,可能手机信号不好,可能手机不在服务区,或者看的人比较忙,看的 ...
- Exception in thread "main" java.lang.Error: Unresolved compilation problem
初学java,使用eclipse编译时,可能会遇到如下图所示的编译错误(Exception in thread "main" java.lang.Error: Unresolved ...
- B-Spline 样条学习笔记
(1) 对于clamped样条曲线,节点区间的数目等于曲线段的数目. eg: B-样条曲线有11个控制点(即,n = 10), 3次P样条 (即, p=3) ,由 m=n+p+1 则有15 个节点 ...
- Android-UIUtils-工具类
UIUtils工具类,主要是处理和Activity有关,和界面显示层有关的公共方法: package common.library.utils; import android.app.Activity ...
- Android-MediaPlayer-音频播放-普通准备
MediaPlayer是Android设计的媒体播放器,不仅仅可以播放音频文件,还可以播放视频文件 播放:Audio(音频,.mp3)相关 播放:Video(视频,.mp4)相关 以下图,是Andro ...
- 打造自己的Sublime使用环境
1.破解LICENSE(如果不是特穷还是买一个吧,不是特别贵,支持正版)----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855 ...
- Buffer Pool--锁定内存页
锁定内存页在数据库中的优点和缺点: SQL Server 使用VirtualAlloc来分配内存,无内存压力时,SQL Server会尽可能地申请内存来缓存数据,当内存出现压力时,会出现缓存数据频繁地 ...
- jmeter分布式环境
搭建jmeter分布式环境 (1)确定分布式结构,即1台机器部署master.几台机器部署slave? (2)将相同版本的jmeter分别拷贝到这几台机器 (3)修改maste ...
- DNS服务及相关概念
DNS:域名服务器:Domain Name Server IANA:互联网号码管理局:Internet Assigned Numbers Authority ICANN:互联网名称与数字地址分配机构: ...