总感觉树状dp不能用记搜写啊...
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
int n,maxn = -21474836472147483647;
int v[16005];
vector <int> G[16005];
map <int,int> f;
int dp(int x,int fa){
if(f.count(x)) return f[x];
int sum = v[x];
for(int i = 0;i < G[x].size();i++){
int xx = G[x][i];
if(xx != fa)
sum = max(sum,sum + dp(xx,x));
}
return f[x] = sum;
}
int main(){
cin >> n;
for(int i = 1;i <= n;i++)
cin >> v[i];
for(int i = 1;i < n;i++){
int x,y;
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
dp(1,-1);
for(int i = 1;i <= n;i++)
maxn = max(maxn,f[i]);
cout << maxn;
return 0;
}