考虑取和不去 dp[u][0]代表u为根的树不取 儿子v可以取可以不取dp[u][1]代表取u 然后儿子v不能取 水题1A
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 6010;
vector <int> G[maxn];
double dp[maxn][2];
int a[maxn];
int in[maxn];
int n;
void dfs(int u)
{
dp[u][1] = a[u];
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
dfs(v);
dp[u][0] += max(dp[v][0], dp[v][1]);
dp[u][1] += dp[v][0];
}
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; i++)
{
G[i].clear();
in[i] = 0;
scanf("%d", &a[i]);
}
int u, v;
while(scanf("%d %d", &u, &v) && (u+v))
{
G[v].push_back(u);
in[u]++;
}
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
{
if(!in[i])
{
dfs(i);
//printf("%d\n", i);
int ans = max(dp[i][0], dp[i][1]);
printf("%d\n", ans);
break;
}
}
}
return 0;
}
HDU 1520 Anniversary party / 树形DP水题!!!,布布扣,bubuko.com
HDU 1520 Anniversary party / 树形DP水题!!!
原文:http://blog.csdn.net/u011686226/article/details/22596175