JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
Description
0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO。
这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Galo,美味度为w[i]。
OvO发现,如果她摘下了i号Galo,那么i的子树中的Galo以及i到根的路径上的其他Galo都会死掉。
OvO的袋子只能装k个Galo,她的嘴巴里还能叼1个,请问她所摘Galo的美味度之和的最大值是多少?
Input
第一行两个正整数n,k。
第二行到第n行,第i行两个正整数f[i],w[i],表示i号点的父亲为f[i] (保证x[i]
Output
一行一个非负整数,为最大美味值。
Sample Input
4 1
1 10
2 3
2 6
Sample Output
10
Data Constraint
30% n,k<=200
30% n*k*k<=10^7
40% n*k<=10^7
对于所有数据,n,k,w[i]<=10^5
Hint
尽管OvO最多可以摘两个Galo,但是最优情况是只摘下第二个点的Galo,美味度为10。
Solution
简单的树形DP。设状态 F[i][j]F[i][j] 表示做到第 ii 个点、已经摘了 jj 个最大答案。
在树上简单转移即可,注意选了自己的话自己的子树就不能选了,于是最后在比较选自己。
由于空间问题,二维数组可以转化为一维数组(相乘),或者开 N 个 vectorvector 也可以。
Code
#include<cstdio>
using namespace std;
const int N=100001;
int n,k,tot;
long long ans;
int first[N],next[N],en[N];
int fa[N],size[N],w[N],p[N];
long long f[N*101];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline long long max(long long x,long long y)
{return x>y?x:y;
}
inline void dfs(int x)
{if(!first[x]) size[x]=1;for(int i=first[x];i;i=next[i])if(en[i]!=fa[x]){dfs(en[i]);size[x]+=size[en[i]];for(int j=min(size[x],k);j>=0;j--)for(int l=min(size[en[i]],j);l>=0;l--)f[p[x]+j]=max(f[p[x]+j],f[p[x]+j-l]+f[p[en[i]]+l]);}f[p[x]+1]=max(f[p[x]+1],w[x]);
}
int main()
{n=read(),k=read()+1;for(int i=2;i<=n;i++){insert(fa[i]=read(),i);w[i]=read();p[i]=(i-1)*(k+1);}dfs(1);for(int i=1;i<=k;i++) ans=max(ans,f[i]);printf("%lld",ans);return 0;
}
JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo相关推荐
- 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- 【NOIP2017提高A组集训10.25】摘Galo (树形dp)
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜
Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...
- JZOJ 5425. 【NOIP2017提高A组集训10.25】数论
Description 聪明的0v0正在学习莫比乌斯反演. 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵-- 剩下的题面,聪明的0v0不记得了.但是,她通过自己高超的数论技巧,给出了一个转 ...
- JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜
Description Input 第一行两个整数n;m 表示电子个数和询问个数. 接下来n 行, 每行两个整数x; y 表示vi. 接下来m 行, 每行形如1 p x y 或2 l r, 分别表示两 ...
- JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
Description Input Output Sample Input 5 1 4 2 5 1 4 1 1 2 4 Sample Output 2 1 4 Data Constraint Solu ...
- 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
这是一道DP题,然后做的时候发现,DP式子死活推不出来. 题目大意(本人实在是不想复制了呵-- 给出A,B序列 找出他们的最长公共严格递增子序列 明确,这是一道DP 所以设状态fi,jf_{i,j}f ...
- JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
题解 题目的意思是求两个序列的最长公共上升子序列. 就此可以联想到求两个序列的最长公共子序列: 设fi,jf_{i,j}表示a序列处理到i,b序列处理j的最长公共子序列, 转移很简单. 现在要满足公共 ...
最新文章
- javascript 手势缩放 旋转 拖动支持:hammer.js
- 99%创业会失败 去中心化是良药么?
- JAVA——基于HttpComponents(HttpClient)的简单网络爬虫DEMO
- CSS完美实现iframe高度自适应(支持跨域)
- 2017.6.26小学期1
- java mina unix client
- c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客
- 在Vmware下linux与ARM开发板的NFS系统搭建【ZT】
- 云原生 CI/CD 框架 Tekton 初体验
- 解决Linux中文乱码问题
- ibm服务器系统电池型号,IBM服务器_X366型号2003系统恢复
- matlab气体流速,气体流速的测定方法.pdf
- 硬盘克隆 计算机更换硬盘,换硬盘数据怎么办 看一招本地磁盘对拷
- word到处html分页,请问如何把做好的word分页导出为html格式
- 2021-09-08 网安实验-编码解码-九宫格键盘编码
- 如何使用百数扫码实现高效信息录入与查询
- 我的世界服务器总是显示错误,win 10 进mc服务器总是错误 怎么办
- 【Scrum模式语言15】发布计划(Release Plan)
- 包装类型与引用类型的使用场景
- R网格MIC与频繁项集