题面

一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大

还看不懂?……

2   5		input:5 2		output:21
\ / 1 3 1
3 4 1 4 10
\ / 2 3 20
1 3 5 20

能理解了吧!

思路:

树形打屁DP

很基础的一道树形DP

对于每个点,用f[k][i]记录在以k为根的子树中,取i条枝的最大值

注意:

1、要注意叶子节点的判断

2、有可能只取一侧的子树

Code:

#include<bits/stdc++.h>
#define N 110
using namespace std;
int b[N][5],s[N];
int n,p;
int a[N][N],f[N][N];
int read()
{
int s=0;
char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
{
s=(s<<1)+(s<<3)+c-'0';
c=getchar();
}
return s;
}
void DFS(int k,int fa)
{
if(s[k]==1)//叶子节点直接返回
return;
int i,j;
int l,r,value;
l=r=0;
for(i=1;i<=s[k];i++)//把l儿子和r儿子处理出来,其实不用严格区分l和r,因为效果是一样的
if(b[k][i]!=fa)
{
if(!l)
l=b[k][i];
else
r=b[k][i];
}
DFS(l,k);DFS(r,k);
f[k][1]=max(a[k][l],a[k][r]);//
for(i=0;i<=p-2;i++)//由于默认要选左枝和右枝,所以i要-2
{
f[k][i+2]=max(f[l][i+1]+a[k][l],f[r][i+1]+a[k][r]);//可能直选一边
for(j=0;j<=i;j++)//分配左子树多少,右子树去多少枝,不用判断是否能够取满,因为取满的总是最优的
{//不会影响
value=f[l][j]+a[k][l]+f[r][i-j]+a[k][r];
f[k][i+2]=max(f[k][i+2],value);
}
}
return;
}
int main()
{
int i,x,y;
n=read();p=read();
for(i=1;i<n;i++)
{
x=read(),y=read(),a[x][y]=read();//矩阵存边权
b[x][++s[x]]=y;b[y][++s[y]]=x;//存边,由于边数不多,直接用邻接表存,不用链式前向星
}
DFS(1,0);//以1为根遍历数
printf("%d",f[1][p]);//输出最后结果
return 0;
}

「Luogu P2015」二叉苹果树 解题报告的更多相关文章

  1. 「Luogu P3866」[TJOI2009]战争游戏 解题报告

    题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...

  2. 「Luogu P1210」回文检测 解题报告

    题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...

  3. 「Luogu P4987」回文项链 解题报告

    题面 求环中的长度为k(k为奇数)且回文中心不同的回文串个数 思路: 刚学manacher算法,就送上一道模板题,此题注重对manacher算法的理解 Manacher,但是不用插入其他符号,因为k是 ...

  4. 「Luogu P1435」回文字串 解题报告

    题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...

  5. 「面试高频」二叉搜索树&双指针&贪心 算法题指北

    本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些 ...

  6. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

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

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是 ...

  8. 【洛谷P2015】二叉苹果树

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

  9. 【P2015】二叉苹果树(树状DP)

    蒟蒻弱弱的开始做树形DP了,虽然做了这道题还是有很多不懂得地方. 这道题大意就是有一棵树,只保留其中q条边,求出剩余边的最大权值. 然后开始考虑怎么做(其实是看着题解出思路....),很容易可以想出D ...

随机推荐

  1. HZOJ 那一天我们许下约定

    比较好想的一道题,只是那个组合数比较恶心. 先说一下我最开始想的$n^4$的沙雕dp: 设f[i][j][k]为前i天给了j个,第i天给了k个,则f[i][j][k]=∑f[i-1][j-k][o]; ...

  2. @noi - 172@ 追捕大象

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在一块平原上有一头大象. 平原被分成 n×m 个格子.初始时大象 ...

  3. 2019-2-21-PowerShell-通过-WMI-获取设备厂商

    title author date CreateTime categories PowerShell 通过 WMI 获取设备厂商 lindexi 2019-2-21 20:2:45 +0800 201 ...

  4. PHP 内存管理及垃圾回收机制

    PHP5的内存管理 对象传递 PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval). ...

  5. 接管SpringBoot对Activiti的数据源自动配置

    SpringBoot的自动配置真的让人又爱又恨,但还是爱更多一点. SpringBoot想要帮我们自动配置好一切,但是有时候配置的却并不是我们需要的,甚至有时候会默默的坑我们. 我的项目是一个多数据源 ...

  6. tomcat access日志

    每次看access log都会记不住pattern里的各个标识代表的什么意思,记录下,备忘! tomcat的access log是由实现了org.apache.catalina.AccessLog接口 ...

  7. java StringBuffer 与 StringBuilder

    String是不可变类,一旦String对象被创建,包含在对象中的字符序列是不可变的,直到对象被销毁: StringBuffer 与 StringBuilder对象则是可变的! 举例说明这两个的好处: ...

  8. vue——父子传值

    转载地址:https://blog.csdn.net/xr510002594/article/details/83304141

  9. tensorflow在文本处理中的使用——TF-IDF算法

    代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...

  10. Linux 内核 启动时间

    为见到 PCI 如何工作的, 我们从系统启动开始, 因为那是设备被配置的时候. 当一个 PCI 设备上电时, 硬件保持非激活. 换句话说, 设备只响应配置交易. 在上电时, 设备没有内存并且没有 I/ ...