沒有上司的舞會
樹形dp
用vector建圖,找到沒有boss的那個點,從這個點開始dfs
而每個點都有兩種情況,一是選擇這個點取得的最大值和不選取得最大值,dp[i][1]表示選擇這個點時的最大值, dp[i][0]表示不選這個點取得最大值,方程式爲 dp[x][0]+=max(dp[i][1],dp[i][0]);dp[x][1]+=dp[i][0];
#include <iostream>
#include <cstdio>
#include <vector>
#define MAX 6010
using namespace std;
int dp[MAX][2];
int N;
int happiness[MAX];
vector<int> edge[MAX];
void dfs(int u)
{
dp[u][0] = 0;
dp[u][1] = happiness[u];
for(int v:edge[u])
{
dfs(v);
dp[u][0] += max(dp[v][0],dp[v][1]);
dp[u][1] += dp[v][0];
}
}
/*
*/
int boss[MAX];
int main()
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&happiness[i]);
for(int i=0;i<N-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
edge[y].push_back(x);
boss[x] = y;
}
int root = 1;
for(int i=1;i<=N;i++)
{
if(boss[i]==0)
{
dfs(i);
root = i;
break;
}
}
printf("%d\n",max(dp[root][0],dp[root][1]));
getchar();
getchar();
}