树形 dp 模板题。
真的好像所有 dp 都可以写记忆化搜索(yyds!
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int f[N][2], first[N], Next[N], to[N], h[N], vis[N], tot, n;
void add(int x, int y)
{
Next[++tot] = first[x];
first[x] = tot;
to[tot] = y;
return;
}
void dp(int u)
{
if(vis[u])
{
return;
}
vis[u] = 1;
for(int i = first[u]; i; i = Next[i])
{
int v = to[i];
if(vis[v])
{
continue;
}
dp(v);
f[u][0] += max(f[v][0], f[v][1]);
f[u][1] += f[v][0];
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> f[i][1];
}
int u, v;
for(int i = 1; i <= n - 1; i++)
{
cin >> u >> v;
add(v, u);
h[u] = 1;
}
for(int i = 1; i <= n; i++)
{
if(!h[i])
{
dp(i);
cout << max(f[i][0], f[i][1]) << endl;
}
}
return 0;
}