P1352 没有上司的舞会(树上 DP)

树上 DP 一般对于子树设状态。
发现子树树根选不选很重要,于是在状态里面开出一维。
转移比较简单,时间复杂度 \(O(n)\)

#include<bits/stdc++.h>
using namespace std;
const int N=6009;
vector<int> o[N];
int f[N],dp[N][2],val[N],n;
void dfs(int i){
    dp[i][1]=val[i];
    for(int j:o[i])
        dfs(j),dp[i][0]+=max(0,max(dp[j][0],dp[j][1])),dp[i][1]+=max(0,dp[j][0]);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&val[i]);
    for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),o[v].push_back(u),f[u]=v;
    for(int i=1;i<=n;i++) if(f[i]==0)
        dfs(i),printf("%d\n",max(dp[i][0],dp[i][1])),exit(0);
    return 0;
}
posted @ 2026-02-17 20:21  2025ing  阅读(2)  评论(0)    收藏  举报