【P1303】苹果二叉树

树归入门题

原题:

有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)。这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树: 
2 5 
\ / 
3   4 
 \ / 
  1 
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。

1<=Q<= N,1<N<=100

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

核心思想是用f[x][y]表示以x为根的子树保留y条根的最大值

每次枚举i,f[x][y]=max(f[x][y],f[lchild][i]+f[rchild][y-i-1]),如果f[lchild][i]==0或f[rchild][y-i-1]==0,进去递归,求出f[lchild][i]或f[rchild][y-i-1]再更新

当size==1或y==0时要特判

刚开始写的时候写成先分别把lchild和rchild从0-size[lchild]或size[rchild]的最优值求出来,在枚举i更新x的从0-size[x]的最优值,不过这么做好想错了,看了oy学长的程序才改过来

不知道像上面这么写↑能不能写对,还需要做更多的题总结

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int read(){int z=0,mark=1;  char ch=getchar();
 8     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)mark=-1;  ch=getchar();}
 9     while(ch>=‘0‘&&ch<=‘9‘){z=(z<<3)+(z<<1)+ch-‘0‘;  ch=getchar();}
10     return z*mark;
11 }
12 struct ddd{int next,y,value;}e[210];int LINK[110],ltop=0;
13 inline void insert(int x,int y,int z){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;e[ltop].value=z;}
14 struct dcd{int lchild,rchild,value,size;}tree[210];
15 int n,m;
16 bool visited[110];
17 int f[110][110];
18 void get_tree(int x,int y){
19     visited[x]=true;
20     tree[x].value=y;
21     for(int i=LINK[x];i;i=e[i].next)if(!visited[e[i].y]){
22         if(!tree[x].lchild)  tree[x].lchild=e[i].y;
23         else  tree[x].rchild=e[i].y;
24         get_tree(e[i].y,e[i].value);
25     }
26     tree[x].size=tree[tree[x].lchild].size+tree[tree[x].rchild].size+1;
27 }
28 void tree_DP(int x,int y){
29     if(y==0)  f[x][y]=0;
30     else if(!tree[x].lchild && !tree[x].rchild)  f[x][y]=tree[x].value;
31     else{
32         for(int i=0;i<y;i++){
33             if(f[tree[x].lchild][i]==0)  tree_DP(tree[x].lchild,i);
34             if(f[tree[x].rchild][y-i-1]==0)  tree_DP(tree[x].rchild,y-i-1);
35             f[x][y]=max(f[x][y],f[tree[x].lchild][i]+f[tree[x].rchild][y-i-1]);
36         }
37         f[x][y]+=tree[x].value;
38     }
39 }
40 int main(){//freopen("ddd.in","r",stdin);
41     memset(visited,0,sizeof(visited));
42     memset(tree,0,sizeof(tree));
43     memset(f,0,sizeof(f));
44     cin>>n>>m;
45     int _left,_right,_value;
46     for(int i=1;i<n;i++){
47         _left=read();  _right=read();  _value=read();
48         insert(_left,_right,_value);  insert(_right,_left,_value);
49     }
50     get_tree(1,0);
51     tree_DP(1,m+1);
52     cout<<f[1][m+1]<<endl;
53     return 0;
54 }

时间: 2024-10-18 03:15:01

【P1303】苹果二叉树的相关文章

刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)

题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课并考核通过就能获得相应的学分.在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修.例如<Frontpage>必须在选修了<Windows操作基础>之后才能选修.我们称<Windows操作基础>是<Frontpage

#5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树

Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25232   Accepted: 7503 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been

asp.net,java,jsp,安卓Android,苹果ios,php,vb.net,c#免费毕业课程设计源码共享网盘下载

百度网盘下载地址1:  http://pan.baidu.com/s/1o67fybC 百度网盘下载地址2: http://pan.baidu.com/s/1kTxckmF163网盘下载地址:http://home.163disk.com/shuangyulin file://E:\计算机设计参考!!!!!!!!!!!\资料 (4 folders, 0 files, 0 bytes, 641.25 MB in total.) ├─QQ254540457 (0 folders, 49 files,

Iphone安装Shadowsocket扶墙SS苹果IOS

最近严打很多SS都不让下载,如果你是苹果还没有越狱需要你是用国外ID去注册下载.这样很麻烦. 无意中在国内第三方软件"爱思助手"里发现这个软件. Shadowsocket适合Iphone未越狱,系统是IOS9.0+以上的版本. 电脑先安装"爱思助手"或者直接在手机上安装"爱思助手".手机连接到电脑,点击"应用游戏"--搜索"Shadowsocket",在搜索到列表里找到如图的对应图标下载并安装提示安装. 自

苹果三星新“机皇”遇冷,国产手机该高兴吗?

几年前这还是让人不敢想象的情景:安卓与iOs两大阵营的"机皇"---Note8和iPhoneX,在中国"手机春晚"的年度压轴表演,就真的仅仅是"表演"而已.整个中国手机产业界完全是冷眼旁观.这旁观不是羡慕和嫉妒,而是真的有点漠不关心. 原因简单明了:Note8与iPhoneX刚一发布就已经被所有人认定,在中国市场没有前途.而主流消费者几乎可以肯定地说,将会在一阵感慨之后立刻转身投入国产手机的怀抱. 手机市场的竞争,无非 硬件性价比 + 软件生态

C#实现二叉树的遍历

C#实现二叉树的前序.中序.后序遍历. public class BinaryTreeNode     {         int value;         BinaryTreeNode left;         BinaryTreeNode right;         /// <summary>         /// 前序遍历         /// </summary>         /// <param name="tree">&l

苹果不再“雁过拔毛”的背后:利益博弈下谁是赢家?

自从库克成为苹果大当家后,苹果似乎就一直奔着利润一股脑地扎进去了.iPhone万年不变样,就连有所改变的iPhone X在售价上也是"穷凶极恶",吃相极其难看.而在今年4月份腾讯微信官方发布通告,更是将苹果推上风口浪尖.微信官方表示,由于受苹果公司新规定影响,iOS 平台的微信客户端关闭公众号打赏功能. 至于微博问答.知乎问答.今日头条及众多直播平台等在内,都逃不过苹果的"雁过拔毛"--苹果认为应用上的打赏属于"内购"行为,去抽取30%的分成.但

苹果高管斯洛基介绍A11仿生芯片背后的秘密!

9月13日凌晨,苹果在秋季发布会上正式推出了全新一代iPhone智能手机:iPhone 8.iPhone 8 Plus和iPhone X(发音为iPhone 10).这三款新设备的都搭载了全新的移动芯片,苹果称之为A11仿生(不是"Fusion"),并表示这是iPhone上有史以来最强大.最智能的芯片. 通过发布会介绍的A11仿生芯片细节,不难发现苹果自主定制芯片野心非常大,可谓雄心勃勃.并且随着时间的推移,针对半导体芯片的定制设计越来越多,A11达到了前所未有的高度.苹果在发布会中的

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层