1. 程式人生 > >poj2342---Anniversary party(樹狀DP入門)

poj2342---Anniversary party(樹狀DP入門)

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;
}