ural 1018 Binary Apple Tree(树形DP)建二叉树
2014-01-16 19:37
471 查看
1、http://acm.timus.ru/problem.aspx?space=1&num=1018
2、题目大意:
给出一棵树,该树有n个结点,每条边都有一定量的苹果,现在要删除其中的一部分分支,使得分支数为m条,求最多可以保留多少苹果。其中1号点始终是树根
分析:要想删除第i条边,那么i边的子边也将随着删除,
我们把每条边的值都保存在结点中,对于一条边有两个结点即父节点和子节点,我们把权值放到子节点中,那么根节点即1点权值是0;
保留m条边即保留m+1个结点
用dp[rt][m]表示以rt为根,保留m个子节点的最大值(如果包括rt这个根节点,那么是m+1个结点)
dp[rt][m]=max(dp[rt][m],dp[rt.left][a]+dp[rt.right][b])+tree[rt].w;
即以rt为根的最大值就等于以rt左孩子为根的a条边和加上以rt右孩子为根的b条边和,最后在加上rt自己本身
所以a+b+1=m
3、AC代码:
2、题目大意:
给出一棵树,该树有n个结点,每条边都有一定量的苹果,现在要删除其中的一部分分支,使得分支数为m条,求最多可以保留多少苹果。其中1号点始终是树根
分析:要想删除第i条边,那么i边的子边也将随着删除,
我们把每条边的值都保存在结点中,对于一条边有两个结点即父节点和子节点,我们把权值放到子节点中,那么根节点即1点权值是0;
保留m条边即保留m+1个结点
用dp[rt][m]表示以rt为根,保留m个子节点的最大值(如果包括rt这个根节点,那么是m+1个结点)
dp[rt][m]=max(dp[rt][m],dp[rt.left][a]+dp[rt.right][b])+tree[rt].w;
即以rt为根的最大值就等于以rt左孩子为根的a条边和加上以rt右孩子为根的b条边和,最后在加上rt自己本身
所以a+b+1=m
3、AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 205 struct node { int l; int r; int w; } tree ; int v ; int dp ; int visit ; void build(int rt,int n) { visit[rt]=1; for(int i=1; i<=n; i++) { if(visit[i]==0 && v[rt][i]!=-1) { if(tree[rt].l==0) tree[rt].l=i; else tree[rt].r=i; tree[i].w=v[rt][i]; build(i,n); } } } int dfs(int rt,int m) { if(rt==0 || m<=0) return dp[rt][m]=0; if(dp[rt][m]!=-1) return dp[rt][m]; dp[rt][m]=0; for(int a=0;a<m;a++) { int b=m-a-1; dp[rt][m]=max(dp[rt][m],dfs(tree[rt].l,a)+dfs(tree[rt].r,b)); } return dp[rt][m]+=tree[rt].w; } int main() { int n,m,a,b,c; scanf("%d%d",&n,&m); memset(v,-1,sizeof(v)); for(int i=0; i<n-1; i++) { scanf("%d%d%d",&a,&b,&c); v[a][b]=c; v[b][a]=c; } memset(visit,0,sizeof(visit)); memset(tree,0,sizeof(tree)); build(1,n); memset(dp,-1,sizeof(dp)); dfs(1,m+1); printf("%d\n",dp[1][m+1]); return 0; } /* 5 2 1 3 1 1 4 10 2 3 20 3 5 20 */
相关文章推荐
- android 系统 makefile文件(Android.mk)组织结构
- Android JNI使用方法
- const引用测试小程序
- android中viewpager,scrollview、listview的嵌套问题
- Ant自动编译打包&发布 android项目
- s5pv210 android4.0.3调试,如何去掉SGX540硬件加速
- CreateJS 与 Cocos2d-HTML5 的比较
- JsonMappingException: failed to lazily initialize及could not initialize异常
- cocos2dx 动作
- Android View使用详解
- 完全的安卓初学者的NDK开发——几点注意
- Android 如何修改Sim卡语言自适应
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
- android ScrollView滚动距离和判断滚动停止状态
- 基于手机端web开发----“个人中心”列表及“我喜爱的商品”flowView的实现
- nagios监控windows网卡流量
- android:inputType参数类型说明
- R中利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计
- dell srvadmin 安装部署
- android修改鼠标事件