JZOJ 5426 Galo
2017-10-30 22:38
204 查看
Galo
Description
给出一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个果子,美味度为wi。如果摘下了i号果子,那么i的子树中的果子以及i到根的路径上的其他果子都会死掉,都不能摘。
最多能摘k个果子,问所摘果子的美味度之和的最大值是多少。
Data Constraint
n*k<=107wi<=105
Solution
经典例题,其实也没什么好讲的,就是树型依赖动态规划。s[i]表示以i为根的子树大小。
d[i]表示dfs序的第i位的节点。
转移方程式如下
f[i][l]=max(max(f[i+1][l],f[i+s[d[i]]][l]),f[i+s[d[i]]][l-1]+w[d[i]])
不会树型依赖动态规划请点这里
树型依赖动态规划
Code
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define fo(i,j,l) for(int i=j;i<=l;i++) #define fd(i,j,l) for(int i=j;i>=l;i--) using namespace std; typedef long long ll; const long long N=2e7+2e3,M=N/2; ll f ; int ne[M],lb[M],la[M],s[M],d[M],w[M]; int n,m,j,k,l,i,o,a,b; void llb(int a,int b) {ne[++o]=la[a]; la[a]=o; lb[o]=b;} int de(int a,int b) {return (a-1)*(k+1)+b+1;} ll max(ll a,ll b) {if(a>b)return a;else return b;} int main() { freopen("galo.in","r",stdin); freopen("galo.out","w",stdout); cin>>n>>k; int kk=k+1; fo(i,2,n){ scanf("%d%d",&a,&b); llb(a,i); w[i]=b; } int r,t; d[k=1]=1; s[1]=1; s[0]=0; for(f[1]=r=1;r;){ t=f[r]; s[t]+=s[f[r+1]]; if(la[t]){ f[++r]=lb[la[t]]; d[++k]=f[r]; la[t]=ne[la[t]]; s[f[r]]=1; f[r+1]=0; }else r--; } w[1]=0; fo(i,1,n)f[de(i,0)]=0; k=kk; fd(i,n,1) fo(l,1,k) f[de(i,l)]= max(max(f[de(i+1,l)],f[de(i+s[d[i]],l)]),f[de(i+s[d[i]],l-1)]+w[d[i]]); ll ans=0; fo(i,1,k)ans=max(ans,f[de(1,i)]); printf("%lld",ans); }
相关文章推荐
- 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
- [JZOJ5426]摘Galo
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
- JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
- JZOJ2017.08.08 C组
- JZOJ 8.10 B组总结
- [JZOJ5251]决战
- [jzoj]1262. 为奶牛熄灯(迭代加深搜索+一堆优化vs记忆化vs状压DP)
- 【JZOJ 5271】神奇的救火现场
- [jzoj]1229. Hanoi(DP决策最优性优化)
- 【JZOJ 5284】 超级翻转
- 【jzoj5290】【NOIP2017提高组A组模拟8.17】【行程的交集】
- JZOJ4740. 【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划(2017.8B组)
- 【JZOJ5270】【GDOI2018模拟8.14】神奇的矩阵
- JZOJ.5287【NOIP2017模拟8.16】最短路
- 【JZOJ5295】【清华集训模拟】Create(主席树)
- jzoj5335 【NOIP2017提高A组模拟8.24】早苗 (递推优化矩乘)
- JZOJ 5280 膜法师
- 【JZOJ5342】【NOIP2017模拟9.2A组】赤壁情