题目:hdu1520
题意:每个人有自己的欢愉度值,每个人不能和他的上级同时出现,最大欢愉值是多少
思路:树形dp入门题,建一棵树,从下往上dp,dp[i][0]表示第i个人不去,dp[i][1]表示去
CODE
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxn 6003
using namespace std;
int dp[maxn][2];
int f[maxn];
vector<int> v[maxn];
void dfs(int root)
{
for (int i = 0; i < v[root].size(); i++) {
dfs(v[root][i]); //递归root的所有孩子
}
for (int i = 0; i < v[root].size(); i++) { //回溯,从下往上dp
dp[root][0] += max(dp[v[root][i]][0], dp[v[root][i]][1]);
dp[root][1] += dp[v[root][i]][0];
}
}
int main()
{
int n, l, k;
while (~scanf("%d", &n)) {
for (int i = 1; i <= n; i++) {
scanf("%d", &dp[i][1]);
f[i] = -1;
dp[i][0] = 0;
v[i].clear();
}
while (scanf("%d%d", &l, &k) && l && k) {
f[l] = k;
v[k].push_back(l); //k指向l,建立有向图
}
int root = 1; //找到根
while (f[root] != -1)
root = f[root];
dfs(root);
printf("%d\n", max(dp[root][1], dp[root][0]));
}
return 0;
}