洛谷P1352沒有上司的舞會-題解
阿新 • • 發佈:2020-08-09
原題:
思路:
經典樹形DP
藉此題講解一下樹形DP
顧名思義,樹形DP以「子樹」作為單位進行DP
由於這個性質,DFS成了實現的最好選擇
先DFS求出子問題,隨後得出當前規模答案。
詳見程式碼
程式碼:
#include <bits/stdc++.h> using namespace std; int n,a[6050]; int v_[6050]; int f[6050][6050]; struct edge { int u,v,nxt; }E[6050]; int h[6050]; int cnt; void add_edge(int u,int v) { E[cnt++].u=u; E[cnt].v=v; E[cnt].nxt=h[u]; h[u]=cnt; } void dp(int x) { f[x][0]=0; f[x][1]=a[x]; for(int i=h[x];i;i=E[i].nxt) { dp(E[i].v); f[x][0]+=max(f[E[i].v][0],f[E[i].v][1]); f[x][1]+=f[E[i].v][0]; } } int main() { cin >> n; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=1;i<=n-1;i++) { int u,v; cin >> u >> v; add_edge(v,u); v_[u]=1; } int rt; for(int i=1;i<=n;i++) if(!v_[i]) { rt=i; break; } dp(rt); cout << max(f[rt][0],f[rt][1]) << endl; return 0; }