树上最大子列和,开一个dp数组表示以当前节点为起点的路线最大能量值为多少,然后就是一些状态的转移。
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+100; typedef long long ll; vector<int> g[maxn]; ll dp[maxn];//表示以第i个节点为起点的路线的最大力量值 ll a[maxn]; int N; void dfs (int u,int pre) { dp[u]=a[u]; for (int i=0;i<g[u].size();i++) { int v=g[u][i]; if (v==pre) continue; dfs(v,u); dp[u]+=dp[v]; if (dp[u]<0) dp[u]=0; } } int main () { int T; scanf("%d",&T); while (T--) { scanf("%d",&N); dp[0]=0; for (int i=1;i<=N;i++) scanf("%lld",&a[i]),dp[i]=0,g[i].clear(); for (int i=1;i<N;i++) { int u,v; scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } ll ans=0; dfs(1,0); for (int i=1;i<=N;i++) ans=max(ans,dp[i]); cout<<ans<<" "; } }