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相关推荐

  1. 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  2. 【NOIP2017提高A组集训10.25】摘Galo (树形dp)

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  3. JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  4. JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜

    Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...

  5. JZOJ 5425. 【NOIP2017提高A组集训10.25】数论

    Description 聪明的0v0正在学习莫比乌斯反演. 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵-- 剩下的题面,聪明的0v0不记得了.但是,她通过自己高超的数论技巧,给出了一个转 ...

  6. JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜

    Description Input 第一行两个整数n;m 表示电子个数和询问个数. 接下来n 行, 每行两个整数x; y 表示vi. 接下来m 行, 每行形如1 p x y 或2 l r, 分别表示两 ...

  7. 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 ...

  8. 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    这是一道DP题,然后做的时候发现,DP式子死活推不出来. 题目大意(本人实在是不想复制了呵-- 给出A,B序列 找出他们的最长公共严格递增子序列 明确,这是一道DP 所以设状态fi,jf_{i,j}f ...

  9. JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    题解 题目的意思是求两个序列的最长公共上升子序列. 就此可以联想到求两个序列的最长公共子序列: 设fi,jf_{i,j}表示a序列处理到i,b序列处理j的最长公共子序列, 转移很简单. 现在要满足公共 ...

最新文章

  1. javascript 手势缩放 旋转 拖动支持:hammer.js
  2. 99%创业会失败 去中心化是良药么?
  3. JAVA——基于HttpComponents(HttpClient)的简单网络爬虫DEMO
  4. CSS完美实现iframe高度自适应(支持跨域)
  5. 2017.6.26小学期1
  6. java mina unix client
  7. c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客
  8. 在Vmware下linux与ARM开发板的NFS系统搭建【ZT】
  9. 云原生 CI/CD 框架 Tekton 初体验
  10. 解决Linux中文乱码问题
  11. ibm服务器系统电池型号,IBM服务器_X366型号2003系统恢复
  12. matlab气体流速,气体流速的测定方法.pdf
  13. 硬盘克隆 计算机更换硬盘,换硬盘数据怎么办 看一招本地磁盘对拷
  14. word到处html分页,请问如何把做好的word分页导出为html格式
  15. 2021-09-08 网安实验-编码解码-九宫格键盘编码
  16. 如何使用百数扫码实现高效信息录入与查询
  17. 我的世界服务器总是显示错误,win 10 进mc服务器总是错误 怎么办
  18. 【Scrum模式语言15】发布计划(Release Plan)
  19. 包装类型与引用类型的使用场景
  20. R网格MIC与频繁项集

热门文章

  1. linux环境将python程序做成可执行
  2. 在idea中使用构造方法
  3. caffe教程翻译:在caffe上训练与测试数据
  4. 【Python】while里面是负数时条件还为真吗?
  5. 【专利】检索网站到底哪个能用?
  6. TI公司dsp的cmd配置文件的说明
  7. 科大星云诗社动态20210312
  8. 科大星云诗社动态20210823
  9. 通过History Trends Unlimited通过统计笔记本Chrome浏览器Top10网页历史访问量(截止至2021.11.23)
  10. pyinstaller打包exe程序教程推荐及需要注意的点