题解 | 没有上司的舞会

没有上司的舞会

https://www.nowcoder.com/practice/f703237089ee42d9b37e01d70e14e2fc

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+6;
int value[N];
int dp[N][2];
bool root[N];
vector<vector<int>>tree;
void dfs(int now){
    /*对于当前的now结点,有选和不选两种可能,不选的最大值为子结点选或者不选相加,选的最大值,为子结点不选相加*/
    for(int i:tree[now]){
        dfs(i);/*不用考虑那么多,反正你是从根结点开始的,所以你直接往下搜索即可*/
        dp[now][1]+=dp[i][0];
        dp[now][0]=max(dp[now][0]+dp[i][0],dp[now][0]+dp[i][1]);
    }
    dp[now][1]+=value[now];
}
int main(){
    int n;
    cin>>n;
    tree.resize(n+1);
    for(int i=1;i<=n;i++){cin>>value[i];dp[i][0]=0;dp[i][1]=0;}
    for(int i=1;i<n;i++){
        int l,r;
        cin>>l>>r;
        tree[l].push_back(r);
        root[r]=true;
    }
    int gen;
    for(int i=1;i<=n;i++){
        if(!root[i]){gen=i;break;}
    }
    dfs(gen);
    cout<<max(dp[gen][1],dp[gen][0]);
    return 0;
}

全部评论

相关推荐

11-13 12:02
门头沟学院 Java
我要娶个什么名:好骂,好骂 别学计算机就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务