poj2342---Anniversary party(樹狀DP入門)
阿新 • • 發佈:2018-11-10
https://vjudge.net/problem/POJ-2342
題意:在一個公司中,每個職員有一個快樂值ai,現在要開一個party,邀請了一個員工就不可能邀請其直屬上司,同理邀請了一個人就不可以邀請其的直屬員工,問如何使得這個快樂值達到最大。
思路:dp[maxn][2];
dp[i][0],表示不去,dp[i][1]表示去.設u為i的孩子;
dp[i][0]=(i的全部員工的max(dp[u][1],dp[u][0)相加,也就是其子員工來或不來的最大快樂值。
dp[i][1]=(i的全部員工的dp[u][0相加,也就是其子員工都不能不來的最大快樂值。
從root開始dp,最終結果就是max(dp[root][0],dp[root][1])。
注意:此處已確保關係為一棵樹,並且root為根.
類似題目:https://blog.csdn.net/qq_38924883/article/details/82989140
#include<iostream> #define maxn 6005 using namespace std; int dp[maxn][2],father[maxn],vis[maxn]; int n; void dfs(int node) { for(int i=1;i<=n;i++) { if(father[i]==node&&!vis[i]) { dfs(i); dp[node][0]+=max(dp[i][0],dp[i][1]); dp[node][1]+=dp[i][0]; } } } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) cin>>dp[i][1],vis[i]=0; int x,y,root; while(cin>>x>>y) { if(x==0&&y==0) break; father[x]=y; root=y; } dfs(y); cout<<max(dp[root][0],dp[root][1])<<endl; return 0; }