樹上DP入門題ios
dp[][0]表示不選他且以他爲根的子樹的最大快樂值spa
dp[][1]表示選他且以他爲根的子樹的最大快樂值code
轉移方程 .... 看代碼吧ci
// luogu-judger-enable-o2 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int base[6010],enter[6010]; int to[15000],nex[15000],head[15000]; int dp[6010][2]; void dfs(int u) { dp[u][0]=0; dp[u][1]=base[u]; for(int i=head[u];i;i=nex[i]) { dfs(to[i]); dp[u][0]+=max(dp[to[i]][0],dp[to[i]][1]); dp[u][1]+=dp[to[i]][0]; } } int main() { ios::sync_with_stdio(false); int n,l,k,s; cin>>n; for(int i=1;i<=n;i++) cin>>base[i]; for(int i=1;i<n;i++) { cin>>l>>k; to[i]=l; nex[i]=head[k]; head[k]=i; ++enter[l]; } for(int i=1;i<=n;i++) if(enter[i]==0) { s=i; break; } dfs(s); cout<<max(dp[s][0],dp[s][1]); return 0; }