P1352 没有上司的舞会(树上 DP)
树上 DP 一般对于子树设状态。
发现子树树根选不选很重要,于是在状态里面开出一维。
转移比较简单,时间复杂度 \(O(n)\)。
#include<bits/stdc++.h>
using namespace std;
const int N=6009;
vector<int> o[N];
int f[N],dp[N][2],val[N],n;
void dfs(int i){
dp[i][1]=val[i];
for(int j:o[i])
dfs(j),dp[i][0]+=max(0,max(dp[j][0],dp[j][1])),dp[i][1]+=max(0,dp[j][0]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),o[v].push_back(u),f[u]=v;
for(int i=1;i<=n;i++) if(f[i]==0)
dfs(i),printf("%d\n",max(dp[i][0],dp[i][1])),exit(0);
return 0;
}

浙公网安备 33010602011771号