hdu 1520 Anniversary party(树形dp入门)

题意:就是有一个公司,上司和下属不能同时选取,每个员工都有一个幸福值,问怎么选得到的值最大

思路:第一次写树形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;
}
原文地址:https://www.cnblogs.com/lalalatianlalu/p/8481294.html