Timus 1018 树形DP
树形DP,令res[i][j]表示以i为根的子树删除j条边所保留的最大苹果数;
res[i][j]=max(res[i][j],res[lChild][k]+res[rChild][j-k]+value[i]);(0<=j<=inum[i],0<=k<=inum[lChild])
inum[i]表示以i为根的子树树枝的个数,value[i]以i为端点的树枝的苹果树。
代码如下:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 123456789struct node{int value,lChild,rChild;};node nVert[101];struct Adta{int i,value,next;};Adta mVert[202];int res[101][101],head[101],visit[101],inum[101],N,n,m;int add(int s,int t,int w){ mVert[N].i=t; mVert[N].value=w; mVert[N].next=head[s]; head[s]=N;return N++;}int init(int i)//利用构造好的临界表重新建树{int j; visit[i]=1; nVert[i].lChild=nVert[i].rChild=0;for(j=head[i];j;j=mVert[j].next)if(!visit[mVert[j].i]) {if(nVert[i].lChild==0) { nVert[i].lChild=mVert[j].i; nVert[mVert[j].i].value=mVert[j].value; init(mVert[j].i); }else if(nVert[i].rChild==0) { nVert[i].rChild=mVert[j].i; nVert[mVert[j].i].value=mVert[j].value; init(mVert[j].i); } }return 1;}int max(int a,int b){return a > b ? a : b;}int dfs(int i){int j,lc,rc,l; lc=nVert[i].lChild; rc=nVert[i].rChild;if(!lc && !lc) { res[i][0]=nVert[i].value;return res[i][1]; }if(lc) dfs(lc);if(rc) dfs(rc);for(j=0;j<n-m && j<=inum[i];j++) {for(l=0;l<=j;l++)if(l<=inum[lc]+1 && j-l<=inum[rc]+1) res[i][j]=max(res[i][j],res[lc][l]+res[rc][j-l]+nVert[i].value); }return res[i][n-m-1];}int GetInum(int i)//获取以i为根的子树的树枝数{if(!nVert[i].lChild && !nVert[i].rChild) {return 0; }if(nVert[i].lChild) inum[i]+=GetInum(nVert[i].lChild)+1;if(nVert[i].rChild) inum[i]+=GetInum(nVert[i].rChild)+1;return inum[i];}int main(){int i,s,t,w;while(scanf("%d %d",&n,&m)!=EOF) { N=1; memset(head,0,sizeof(head)); memset(visit,0,sizeof(visit)); memset(res,0,sizeof(res)); memset(inum,0,sizeof(inum));for(i=1;i<n;i++) { scanf("%d %d %d",&s,&t,&w); head[s]=add(s,t,w); head[t]=add(t,s,w); } inum[0]=-1; init(1); GetInum(1); printf("%d\n",dfs(1)); }return 0;}
转载于:https://www.cnblogs.com/yu-chao/archive/2012/04/06/2434642.html
Timus 1018 树形DP相关推荐
- Ural 1018 (树形DP+背包+优化)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...
- 树形DP题目。。。转载
树形DP http://acm.hdu.edu.cn/showproblem.php?pid=2196√ 向下搜一遍,向上搜一遍 http://acm.hdu.edu.cn/showproblem.p ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- [NC15748]旅游 树形dp基础
菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
- 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings
题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...
最新文章
- appium的demo编程
- 记最近Linux中遇到cpu使用率低loadavg高的分析过程
- html用bmob做留言,bmob js-sdk 在vue中的使用教程
- 二叉树题目----2 检查两颗树是否相同 和 对称二叉树的判定
- 单元素枚举类实现单例模式
- C语言和设计模式(享元模式)
- 小优机器人系统恢复_一种机器人异常恢复系统及方法与流程
- 关于android的日志输出LogCat
- python运维脚本面试_参加Linux运维面试时经常会被问到的shell脚本问题有哪些?
- 【Win10桌面美化】一个精致的程序员桌面是怎样的呢(花了一上午时间两种风格!)
- [浏览器插件]经典书签同步工具xmarks与chrome自带同步功能比较
- 一个网工的十年奋斗史 - 工作篇
- 【报告分享】头部DTC品牌增长案例库-易观智库零一裂变(附下载)
- 刘鹏教授在淮安市应急管理局作报告
- 《CS:GO》玩家快看,英特尔显卡驱动更新,帧率提升超两倍!
- Python制作的简单易学的猜单词小游戏
- 正交排列法、正交试验设计、正交表
- Linux命令+shell脚本大全:操作文件系统
- 双十一大促有哪些数码好物值得推荐?好用的数码好物清单表分享
- 微服务(一)—— 项目结构
热门文章
- 除非Window Activation Service(WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。IIS 7
- js发送get、post请求的方法简介
- 【算法与数据结构】堆排序是什么鬼?
- hadoop关键进程
- value toDF is not a member of org.apache.spark.rdd.RDD[People]
- 软件设计原则(二)单一职责原则 -Single Responsibility Principle
- @Async注解配合@EnableAsync注解使用
- 使用IntelliJ IDEA搭建多maven模块JAVA项目
- node-red教程 5 函数节点
- SGID,SUID,SBIT