动态规划题。
dp[i][0] 表示不邀请第 i 个人时快乐值之和的最大值
则 dp[i][0] += max(dp[i.child][0], dp[i.child][1]);
dp[i][1] 表示邀请第 i 个人时快乐值之和的最大值
则 dp[i][1] += dp[i.child][0]。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 6005;
struct people //受邀人员
{
int value; //快乐值
int father; //直属上司
vector<int> child; //直属下属
}p[MAXN];
bool vis[MAXN]; //访问情况
int dp[MAXN][2]; //dp[i][0]表示不邀请第i个人,dp[i][1]表示邀请第i个人
//深搜,搜索快乐值之和的最大值
void DFS(int now)
{
vis[now] = true;
for (int i = 0; i < p[now].child.size(); i++)
{
int next = p[now].child[i];
if (vis[next] == false)
{
DFS(next);
dp[now][0] += max(dp[next][0], dp[next][1]);
dp[now][1] += dp[next][0];
}
}
}
int main()
{
int n;
while (cin >> n)
{
memset(p, 0, sizeof(p));
memset(vis, 0, sizeof(vis));
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
{
cin >> dp[i][1];
}
int u, v;
while (cin >> u >> v)
{
if (u == 0 && v == 0)
break;
p[u].father = v;
p[v].child.push_back(u);
}
int root; //根结点
for (int i = 1; i <= n; i++)
{
if (p[i].father == 0)
{
root = i;
break;
}
}
DFS(root);
cout << max(dp[root][0], dp[root][1]) << endl;
}
return 0;
}
继续加油。