E17【模板】树形DP P1352 没有上司的舞会

E17【模板】树形DP P1352 没有上司的舞会_哔哩哔哩_bilibili

 

P1352 没有上司的舞会 - 洛谷

$f_{u,0/1}$ 表示以 $u$ 为根的子树,且 $u$ 不参加/参加舞会的最大快乐值
枚举子树,自底向上转移,
\begin{aligned}
f_{u,0} & =\sum_{v\in son(u)}max(f_{v,0},f_{v,1}) \\
f_{u,1} & =\sum_{v\in son(u)}f_{v,0}+w_u \\
\end{aligned}

// 树形DP O(n)
#include<bits/stdc++.h>
using namespace std;

const int N=6010;
vector<int> e[N];
int n,w[N],fa[N];
int f[N][2]; //f[u][0/1]表示以 u 为根的子树,且 u 不参加/参加舞会的最大快乐值

void dfs(int u){
  f[u][1]=w[u];
  for(int v:e[u]){
    dfs(v);
    f[u][0]+=max(f[v][0],f[v][1]);
    f[u][1]+=f[v][0];
  }
}
int main(){
  cin>>n;
  for(int i=1; i<=n; i++) cin>>w[i];
  for(int i=1,a,b; i<n; i++){
    cin>>a>>b;
    e[b].push_back(a);
    fa[a]=true;
  }
  int o=0;
  for(;fa[++o];); //无父即根
  dfs(o);
  cout<<max(f[o][0],f[o][1]);
}

 

P1122 最大子树和 - 洛谷

UVA1292 Strategic game - 洛谷

 

posted @ 2023-04-10 10:02  董晓  阅读(1270)  评论(0)    收藏  举报