这道题一遍就过,切水题真爽

这道题考察树上贪心,没看出是dp

对于遍历到每个节点的时候,如果发现当前没有变黑则选择

一种可以往上程度越高的方案变黑,对未来状态更优

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100010];
vector<int>G[100010];
int res;
struct node{
    int ex;
    int now;
}f[100010];
void dfs(int u,int cur){
    if(G[u].size()==0){
        f[u].ex=max(cur-a[u]+1,1);
        f[u].now=max(cur-a[u]+1,1);
        res++;
        return;
    }
    f[u].ex=max(1,cur-a[u]+1);
    f[u].now=cur+1;
    for(int i=0;i<(int)G[u].size();i++){
        int v=G[u][i];
        dfs(v,cur+1);
        f[u].ex=min(f[u].ex,f[v].ex);
        f[u].now=min(f[u].now,f[v].now);
    }
    if(f[u].now>cur) {
        res++;
        f[u].now=f[u].ex;
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        int x;
        cin>>x;
        G[x].push_back(i);
    }
    for(int i=1;i<=n;i++)cin>>a[i];
    dfs(1,1);
    cout<<res;
    return 0;
}