E17【模板】树形DP P1352 没有上司的舞会
E17【模板】树形DP P1352 没有上司的舞会_哔哩哔哩_bilibili
$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]); }
浙公网安备 33010602011771号