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

一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包。

首先,定义状态\(dp[x][i]\)表示在节点\(x\)保留\(i\)个边所获得的最大苹果数,定义状态时一定要选对状态并且定义清晰(状态中包括了当前节点吗?目标状态是怎样的?)。一开始我就是因为状态定义错误,所以卡了半天,之后重新定义状态后几分钟就切了这道题。

然后是普通的树上背包状态转移

\[dp[x][i]=max(dp[x][i], dp[x][i-k]+dp[son_x][k-1]+val)
\]

注意,此次已优化了一维,所以\(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 二叉苹果树 (树上背包)的更多相关文章

  1. 洛谷p2015二叉苹果树&yzoj1856多叉苹果树题解

    二叉 多叉 有一棵苹果树,如果树枝有分叉,可以是分多叉,分叉数k>=0(就是说儿子的结点数大于等于0)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1~N,树根编号一定是1.我们用一根树枝两 ...

  2. 洛谷 P2015 二叉苹果树 && caioj1107 树形动态规划(TreeDP)2:二叉苹果树

    这道题一开始是按照caioj上面的方法写的 (1)存储二叉树用结构体,记录左儿子和右儿子 (2)把边上的权值转化到点上,离根远的点上 (3)用记忆化搜索,枚举左右节点分别有多少个点,去递归 这种写法有 ...

  3. 洛谷 P2015 二叉苹果树(codevs5565) 树形dp入门

    dp这一方面的题我都不是很会,所以来练(xue)习(xi),大概把这题弄懂了. 树形dp就是在原本线性上dp改成了在 '树' 这个数据结构上dp. 一般来说,树形dp利用dfs在回溯时进行更新,使用儿 ...

  4. 洛谷 P2015 二叉苹果树 题解

    题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); #include ...

  5. 洛谷 P2015 二叉苹果树

    老规矩,先放题面 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端 ...

  6. 洛谷P2015 二叉苹果树

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

  7. 洛谷—— P2015 二叉苹果树

    https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...

  8. 洛谷P2015 二叉苹果树(树状dp)

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

  9. 洛谷P2015二叉苹果树

    传送门啦 树形 $ dp $ 入门题,学树形 $ dp $ 的话,可以考虑先做这个题. $ f[i][j] $ 表示在 $ i $ 这棵子树中选 $ j $ 个苹果的最大价值. include #in ...

随机推荐

  1. 交互原型画得丑?29个优秀UI/UX线框草图

    现在越来越多UI设计师都需要画一些交互的线框图,然而作为视觉专家,当然要把它画得靓靓的嘛,是不是?所以很多用户会使用<5款高效的原型设计工具>来绘制,或者直接手绘更有逼格. 今天达人手工整 ...

  2. GPS坐标换算为百度坐标(转)

    最近在做一个关于手机定位的小应用,需求是这样的,用户通过手机(Wp8)进行二维码扫描操作并且记录用户的当前位置,在PC上可以查看用户所在地图的位置,做法就是在用户扫描条码时,通过手机GPS获取当前在地 ...

  3. Oracle GoldenGate 四、数据过滤和数据项匹配

    写在开始前 从两周前我花了大量的业余时间阅读GoldenGate官方文档,并根据文档实践和进一步学习了解GoldenGate,以下便是根据官方文档理解总结的GoldenGate学习内容: Oracle ...

  4. 启动项目报错:502 Server dropped connection The following error occurred while trying to access http://localhost:8080/TestDemo:

    之前的项目一直是好的,可以启动,但最近启动出了问题,访问不了,于是找到原因发现是启用了访问国外网站的加速器, 更改了浏览器的代理模式,如下: 解决方法: 打开浏览器,进入到浏览器的网络设置中,将局域网 ...

  5. shell脚本生成xml文件

    今天把这段时间学习完shell后完成工作上的一个小案件整理了一下,分享给大家! 说来也巧了,作为一个刚刚毕业半年的菜鸟,进入公司后,听公司的大牛推荐学习linux--”鸟哥的私房菜“,基本上是从去年8 ...

  6. markdown你的生活 | markdown编辑器简介

    前言 你是否有这样的困扰?希望找一个笔记本记录东西,window自带的notepad(记事本)?,轻量但是功能太有限.word文档?功能虽多,但是很沉重,我们需要花很多时间去想如何排版会更记录会清晰, ...

  7. ZSTU4270 同源数 2017-03-22 14:34 82人阅读 评论(0) 收藏

    4270: 同源数 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 1284  Solved: 224 Description 如果x和y的质因子集合完 ...

  8. Mac提示App已损坏 你应该将它移到废纸篓的解决方案

    现象 "Elmedia Player.app"已损坏,打不开. 您应该将它移到废纸篓. 原因 很多朋友们在安装软件时Mac OS系统出现提示"XXXApp 已损坏&quo ...

  9. 随笔-未整理-linux下流量查看

    nethogs: 按进程查看流量占用 iptraf: 按连接/端口查看流量 ifstat: 按设备查看流量 ethtool: 诊断工具 tcpdump: 抓包工具 ss: 连接查看工具 其他: dst ...

  10. webservice需要的包以及demo

    包地址:http://pan.baidu.com/s/1qWyPgqo demo:http://pan.baidu.com/s/1dDvNJg9