题意:就是有一个公司,上司和下属不能同时选取,每个员工都有一个幸福值,问怎么选得到的值最大
思路:第一次写树形dp,树形dp和线性的dp区别不是很大,但中间穿插了dfs树的思想,但在维护时没有什么区别,只是存储的数据结构不同
代码:
#include <bits/stdc++.h> using namespace std; const int maxn=6000+5; int n,dp[maxn][2],fa[maxn],val[maxn]; vector <int>mp[maxn]; void dfs(int now) { dp[now][1]=val[now]; for(int i=0;i<mp[now].size();i++){ int as=mp[now][i]; dfs(as); dp[now][0]+=max(dp[as][1],dp[as][0]); dp[now][1]+=dp[as][0]; } } int main() { while(~scanf("%d",&n)){ for(int i=1;i<=n;i++){ scanf("%d",&val[i]); mp[i].clear(); } memset(fa,-1,sizeof(fa)); memset(dp,0,sizeof(dp)); while(true){ int t1,t2; scanf("%d%d",&t1,&t2); if(t1==0&&t2==0)break; mp[t2].push_back(t1); fa[t1]=t2; } int rt=1; while(fa[rt]!=-1)rt=fa[rt]; dfs(rt); printf("%d ",max(dp[rt][0],dp[rt][1])); } return 0; }