博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2015 二叉苹果树
阅读量:4920 次
发布时间:2019-06-11

本文共 1443 字,大约阅读时间需要 4 分钟。

P2015 二叉苹果树

题目描述

有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)

这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。

我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树

2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。

给定需要保留的树枝数量,求出最多能留住多少苹果。

输入输出格式

输入格式:

 

第1行2个数,N和Q(1<=Q<= N,1<N<=100)。

N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。

每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。

每根树枝上的苹果不超过30000个。

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
5 21 3 11 4 102 3 203 5 20
输出样例#1:
21
/*    树形dp    dp[i][j]表示节点i保留j个枝条的最大苹果数*/#include
#include
using namespace std;#define maxn 110int m,n,dp[maxn][maxn],num,head[maxn],sz[maxn],fa[maxn];struct node{ int to,v,pre;}e[maxn*2];void predfs(int father,int now){ sz[now]=1; fa[now]=father; for(int i=head[now];i;i=e[i].pre){ int to=e[i].to; if(to==father)continue; predfs(now,to); sz[now]+=sz[to]; }}void Insert(int from,int to,int v){ e[++num].to=to; e[num].v=v; e[num].pre=head[from]; head[from]=num;}void dfs(int now){ for(int i=head[now];i;i=e[i].pre){ int to=e[i].to; if(to==fa[now])continue; dfs(to); for(int j=min(sz[now],m);j>=1;j--){ for(int k=min(j,sz[now]);k>=1;k--){ dp[now][j]=max(dp[now][j],dp[now][j-k]+dp[to][k-1]+e[i].v); } } }}int main(){ scanf("%d%d",&n,&m); int x,y,z; for(int i=1;i

 

转载于:https://www.cnblogs.com/thmyl/p/7383407.html

你可能感兴趣的文章
单例模式
查看>>
网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp
查看>>
Visual Studio 2012 & MyEclipse2015 快捷键对比
查看>>
魔控(电脑遥控器)
查看>>
如何让你的网页符合W3C标准
查看>>
ubuntu下firefox访问12306
查看>>
变量命名规范
查看>>
【转】Matrix67:十个利用矩阵乘法解决的经典题目
查看>>
文件异步上传-ajaxFileUpload
查看>>
开发人员行走Unix的随身四艺
查看>>
织梦联动类型地区联动三级修复以及省份-市级-地区分开+高亮
查看>>
阿里技术嘉年华官网上线啦!
查看>>
获取Android状态栏的高度
查看>>
21. 比较三个整数大小
查看>>
ESXi主机和NTP server快速进行时间同步
查看>>
Python使用random.shuffle()打乱列表顺序
查看>>
(二)
查看>>
浏览器内核引擎
查看>>
SqlServer中怎么删除重复的记录(表中没有id)
查看>>
操作系统基础知识之————单线程(Thread)与多线程的区别
查看>>