「NOIP2018模拟赛」 摘果子 - 树形Dp
题目描述
分析
有依赖的树上背包。可以用Dfs序进行Dp,但更直接的方法是先将其转化为二叉树,在对左右儿子分配,进行Dp。Dfs(x,t)函数表示在以x为根的子树上,还能接受t的毒,所获得的最大美味度。若根节点不选,则直接递归查询右儿子;若根节点选,则对其进行分配,左儿子要i的能接受的毒,右儿子要t-i-p[i]的能接受的毒,再用记忆化优化。最后输出Dfs(1,m)。(注意边界条件与初值,初值应该设为0,因为获得负数的美味程度不如不拿。考试的时候忘了这一点被卡掉了50分)
至于将多叉树转化为二叉树,利用左儿子右兄弟的法则建树。
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=2005,M=2005;
struct Edge {int to,next;
}e[N*2];
int h[N],cnt;
int n,m;
int v[N],p[N];
int f[N][M];
int lc[N],rc[N];
void add(int x,int y) {e[++cnt]=(Edge){y,h[x]};h[x]=cnt;
}
void build(int x,int fa) {int t=0;for (int i=h[x];i;i=e[i].next) {int y=e[i].to;if (y==fa) continue;if (!t) {lc[x]=y;//第一个儿子作为x的左儿子 t=y;} else {rc[t]=y;//其余的儿子作为上一个儿子的右儿子 t=y;}build(y,x);}
}
int Dfs(int x,int t) {if (x==0||t<=0) return 0;//0号节点不存在,返回0;可承受的毒<=0,返回0; if (f[x][t]) return f[x][t];//记忆化f[x][t]=max(Dfs(rc[x],t),0);//根节点不选,直接右儿子 int temp=0;for (int i=0;i<=t-p[x];i++) {temp=max(temp,Dfs(lc[x],i)+Dfs(rc[x],t-i-p[x])+v[x]);//根节点选,左右儿子分配 }f[x][t]=max(f[x][t],temp);return f[x][t];
}
int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) {scanf("%d%d",&v[i],&p[i]);}for (int i=1;i<n;i++) {int a,b;scanf("%d%d",&a,&b);add(a,b);add(b,a);}build(1,0);printf("%d",Dfs(1,m));return 0;
}
「NOIP2018模拟赛」 摘果子 - 树形Dp相关推荐
- 「CSP-S模拟赛」2019第四场
「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...
- jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)
5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...
- 备战Noip2018模拟赛5(B组)T2 Tree 采果子
10月4日备战Noip2018模拟赛5(B组) T2 Tree采果子 题目描述 LYL大牛今天心情不错,于是走到埃及郊外旅游.他边走边向四周望望,发现周围有许多果树.这些树之间互相到达的时间LYL是知 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- 备战Noip2018模拟赛3(B组)T1 Apple 韬韬抢苹果
10月3日备战Noip2018模拟赛3(B组) T1 Apple韬韬抢苹果 题目描述 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发生 ...
- 备战Noip2018模拟赛3(B组) T2 Dance 开场舞蹈
10月3日备战Noip2018模拟赛3(B组) T2 Dance 开场舞蹈 题目描述 在全世界人民的期盼下,2008年北京奥林匹克运动会终于隆重召开了! 为了展示中华民族博大精深的优秀传统文化,负责开 ...
- 备战Noip2018模拟赛10(B组) T1 Max 和最大
10月20日备战Noip2018模拟赛10 T1 Max和最大 题目描述 CYF的黑题,偏题,怪题,黑科技题,大码农题都做腻了,于是她想做一下签到水题,她希望从有一个长度为ň的整数序列(A1,A2,. ...
- 备战Noip2018模拟赛11(B组)T4 Path 好路线
10月27日备战Noip2018模拟赛11(B组) T4路径好路线 题目描述 nodgd在旅游.现在,nodgd要从城市的西北角走到东南角去.这个城市的道路并不平坦,nodgd希望找出一条相对比较好走 ...
- 备战Noip2018模拟赛7(B组)T2 Pearl 数数
10月5日备战Noip2018模拟赛7(B组) T2珍珠数 题目描述 给定Ñ个整数,求值在某个范围内的数的个数. 输入格式 第一行为正整数ñ. 第二行有Ñ个整数(0 <=数值<= 231- ...
最新文章
- left join 和 left outer join 的区别
- windows加固方案
- java实现飞机大战游戏
- ArrayBlockingQueue与LinkedBlockingQueue
- c++ 使用正则匹配url
- DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1
- tensorflow 函数查找
- 东山里的传说——《荒原的呼唤》选载之四
- php单例模式详解,PHP 单例模式解析和实战
- FF的插件iMacros简单交流
- 图片标注工具Labelme的安装及使用方法
- c++打印素数表(线性筛)
- Hot and cold pages
- 拓嘉启远电商:拼多多缺货会降权吗?如何处理
- 【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
- ImageMagick将多张图片拼接成一张图片_不会PS也没关系!我想向你推荐这18款免费好用的在线图片处理工具...
- Linux系统到底是什么?
- 装系统时无法创建新的分区
- Max导Unity Humanoid模型
- 湖北联通联手银行开展网络安全演练
热门文章
- 深入剖析TikTok零播放问题,并附解决方案
- LeetCode和NewCode常见错误(持续更新)
- xmpp协议(即时通信协议规范)
- Android项目连接手机
- [LeetCode]--387. First Unique Character in a String
- RTL8380M/RTL8382M管理型交换机系统软件操作指南二:转发表
- python中return的作用总结
- C语言中squeeze的作用,pytorch下的unsqueeze和squeeze的用法说明
- 华为鸿蒙手机系统什么时候开始更新_华为鸿蒙OS适配计划曝光,一起看看你的手机什么时候可以升级...
- 新手小白学习嵌入式系统怎么学?嵌入式学习路线