题解:P12444 [COTS 2025] 发好奖 / Hijerarhija
前言
不太正常的树形 dp。
Solution
这里假定
首先
然后发现树形背包的做法不太好优化至
这个题求的是有关包含点
这里推荐一个 dfs 写法:设当前考虑到节点
这样还是
这么做是
vector<int >e[N];
ll f[N][N],a[N],b[N];
int n,m;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void dfs(int u){
for(int v:e[u]){
For(i,0,m){
if(i+1<=m) f[v][i+1]=max(f[v][i+1],f[u][i]);
if(i+b[v]<=m) f[v][i+b[v]]=max(f[v][i+b[v]],f[u][i]+a[v]);
}
dfs(v);
For(i,0,m) f[u][i]=max(f[u][i],f[v][i]);
}
}
int main()
{
//freopen("gcx.in","r",stdin);
//freopen("gcx.out","w",stdout);
n=read(),m=read();
For(i,1,n){
For(j,0,m){
f[i][j]=-1e15;
}
}
For(i,2,n){
int u=read();
e[u].pb(i);
}
For(i,1,n) a[i]=read();
For(i,1,n) b[i]=read();
f[1][1]=0,f[1][b[1]]=a[1];
dfs(1);
ll ans=-1e15;
For(i,0,m) ans=max(ans,f[1][i]);
cout<<ans;
return 0;
}