【NOIP2017提高A组集训10.25】摘Galo (树形dp)
来源:互联网 发布:爱普生tx800清零软件 编辑:程序博客网 时间:2024/05/22 06:30
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。
题解
这题朴素的dp复杂度是
其实可以做到
为什么是
因为我们只需要遍历一遍状态,然后每一个状态由于是在dfs序上,所以只有两种转移:
1.选择它本身,并跳过它的子树,也就是在dfs序上加上它的子树大小
2.不选它本身,进入它的子树,也就是在dfs序上加1
然后就少了好多冗余状态。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#include<vector>#define ll long longusing namespace std;inline int read(){ int x=0;char ch=' ';int f=1; while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*f;}struct edge{ int to,next;}e[200001];int n,k,tot;int head[100001];inline void addedge(int x,int y){ e[++tot].to=y;e[tot].next=head[x];head[x]=tot;}vector<ll> f[100005];ll w[100005];int size[100005];int dfn[100005],dfn_clock;inline void dfs(int x,int fa){ size[x]=1; dfn[++dfn_clock]=x; for(int i=head[x];i;i=e[i].next){ int u=e[i].to; if(u==fa)continue; dfs(u,x); size[x]+=size[u]; }}inline ll dp(int i,int j){ if(i>n)return 0; if(j==0)return 0; if(f[i][j])return f[i][j]; f[i][j]=max(f[i][j],dp(i+size[dfn[i]],j-1)+w[dfn[i]]); f[i][j]=max(f[i][j],dp(i+1,j)); return f[i][j];}int main(){ freopen("galo.in","r",stdin); freopen("galo.out","w",stdout); n=read();k=read()+1; for(int i=2;i<=n;i++){ int fa=read(); w[i]=read(); addedge(fa,i);addedge(i,fa); } dfs(1,0); for(int i=1;i<=n;i++){ f[i].resize(k+1); } printf("%lld",dp(1,k)); return 0;}
阅读全文
0 0
- 【NOIP2017提高A组集训10.25】摘Galo (树形dp)
- JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
- 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
- 【NOIP2017提高A组集训10.25】凤凰院凶真(dp)
- JZOJ5418. 【NOIP2017提高A组集训10.24】 树形DP+组合数
- SSL2811 2017年10月30日提高组T2 摘Galo(树形dp)
- 【NOIP2017提高A组集训10.25】吃草
- JZOJ5408. 【NOIP2017提高A组集训10.21】Dark DP
- JZOJ5416. 【NOIP2017提高A组集训10.22】密码 DP
- JZOJ5415. 【NOIP2017提高A组集训10.22】公交运输 DP
- JZOJ5411. 【NOIP2017提高A组集训10.22】友谊 DP
- JZOJ5436. 【NOIP2017提高A组集训10.30】Group DP
- jzoj5408 【NOIP2017提高A组集训10.21】Dark (巧设状态的DP)
- [JZOJ5424]【NOIP2017提高A组集训10.25】凤凰院凶真
- 【JZOJ 5421】【NOIP2017提高A组集训10.25】嘟嘟噜
- 【JZOJ 5424】【NOIP2017提高A组集训10.25】凤凰院凶真
- js数组的常用方法
- C# 3DES 加密
- leetcode习题解答:11. Container With Most Water
- ssm框架搭建(主要配置步骤)
- 网站开发流程,个人心得,欢迎补充
- 【NOIP2017提高A组集训10.25】摘Galo (树形dp)
- Spring Boot系列02-Spring Boot + JSP 整合进行网页开发
- 初识网站安全
- flask-web开发-用户认证代码分析(四)
- 反射
- 互联网协议入门(一)
- 数字图像处理(第三版)—bmp图像的格式
- 大概整理下升级到Android Studio3.0遇到的问题
- linux centos7下QT5添加log4cplus库开发