洛谷 P2015 二叉苹果树 题解

洛谷 P2015

题目

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

现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。


输入

第1行2个数,NNN和QQQ(1<=QQQ<= NNN,1<NNN<=100)。
NNN表示树的结点数,QQQ表示要保留的树枝数量。接下来NNN-1行描述树枝的信息。
每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。
每根树枝上的苹果不超过30000个。


输出

一个数,最多能留住的苹果的数量。


样例

input
5 2
1 3 1
1 4 10
2 3 20
3 5 20

output
21


解题思路

构建一棵树
建双向边
动态转移方程
fff[ddd][jjj]=maxmaxmax(fff[ddd][jjj],fff[aaa[iii].tototo][kkk]+fff[ddd][jjj-kkk-1]+bbb[ddd][aaa[iii].tototo]);
fff[ddd][jjj]意为以ddd为父节点保留j条边的最大苹果数量
一共有jjj条边
kkk条给子节点——aaa[iii].tototo
jjj-kkk-1给别的子节点——也就是aaa[iii].tototo同一个父节点的其他子节点 巨佬叫这,叫兄弟节点
(-1是因为aaa[iii].tototo连向d也用了一条边)


代码

#include<iostream>
#include<cstdio>
using namespace std;
struct hhx{int to,next;
}a[220];
int n,m,x,y,z,t;
int p[120],b[120][120],f[120][120],head[120];
void dp(int d)
{p[d]=1;  for (int i=head[d];i;i=a[i].next)  //找子节点{if (p[a[i].to]==1) continue;  //不可以重复走到父节点dp(a[i].to);  //以它的子节点作为根节点for (int j=m;j>0;j--)  //如01背包,从后往前推for (int k=j-1;k>=0;k--)  //转折点f[d][j]=max(f[d][j],f[a[i].to][k]+f[d][j-k-1]+b[d][a[i].to]);  //更新答案}
}
void add(int x,int y)  //建树
{a[++t].to=y;a[t].next=head[x];head[x]=t;
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);b[x][y]=b[y][x]=z;   //保存苹果树add(x,y);add(y,x);}dp(1);cout<<f[1][m];return 0;
}

洛谷 P2015 二叉苹果树 题解相关推荐

  1. 洛谷P2015 二叉苹果树【树形dp】

    P2015 二叉苹果树 时间限制 1.00s 内存限制 125.00MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点 ...

  2. 洛谷P2015 二叉苹果树

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点) 这棵树共有 NN 个结点(叶子点或者树枝分叉点),编号为 1 \sim N1∼N,树根编号一定是 11. 我们用一 ...

  3. 洛谷 P2015 二叉苹果树

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

  4. 洛谷2015 二叉苹果树 树形DP

    https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...

  5. P2015 二叉苹果树 树形DP

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点) 这棵树共有 NN 个结点(叶子点或者树枝分叉点),编号为 1 \sim N1∼N,树根编号一定是 11. 我们用一 ...

  6. P2015 二叉苹果树

    传送门 这道题要用到链式前向星... 非常标准的树形背包DP 只要理解了,题就不难 只要理解了...... 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树 ...

  7. luogu P2015 二叉苹果树

    一道qq姐和dtx很早就做了的题www 想学树形dp就是从这道题开始的 然后做了几道题 之后被难住了 于是回来做这道题 首先这道题保证了是一棵二叉树 emmmmm 然后一个dp数组 dp[u][j] ...

  8. AcWing1074. 二叉苹果树(树形DP)题解

    题目传送门 题目描述 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点. 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一 ...

  9. 二叉苹果树(树型DP+背包)

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

最新文章

  1. csvtk:命令行下表格统计分析、数据筛选、替换、整理神器
  2. Fragment的运用实列
  3. 还是畅通工程(思想+代码)
  4. vue-router配置介绍和使用方法(二)
  5. Let‘s Encrypt 免费Https证书
  6. Linux与shell编程之一: Linux基础知识总结
  7. AjaxControltoolkit学习笔记—PopupControl 使用详解
  8. PCL之鼠标拾取点云的三维坐标
  9. 6月7日 PowerPoint 版本支持的媒体格式(跨office版本演示需要了解)
  10. 推荐一款平台聚合音乐播放器:Listen 1
  11. 51单片机简易智能温度检测系统
  12. LA 4670 Dominating Patterns
  13. 无线安全-WiFi渗透流程
  14. python版佛祖保佑
  15. webpy模版中写JS代码的陷阱
  16. node-sass是什么?
  17. 正则环视 php,正则高级环视
  18. 声学——声源定位阅读笔记
  19. Ionic2升级到Ionic3
  20. 学Linux选择什么系统比较好?

热门文章

  1. 信息论与编码 通信工程 曹瑞珂 P02014263
  2. SpringBoot入门第二天
  3. 学生管理系统课程设计
  4. 头部玩家指的是什么_什么是头部玩家,有没有一个定义?
  5. 数学软件GeoGebra安装
  6. 伸手摘星,未必如愿,但不会弄脏你的手……
  7. java中excel文件的导入,限制上传的文件类型,文件的大小,显示上传文件的进度条...
  8. caffe 制作数据集
  9. 他是学计算机的这个句子中宾语是动词性的,语法一实词(教师)2017级
  10. The road to learning English-Words