树形dp

Posted Hell0er

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形dp相关的知识,希望对你有一定的参考价值。

 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <vector>
 using namespace std;
 
 const int MAXN=(int)6e3+10;
 
 int n;
 int r[MAXN];
 bool flag[MAXN];
 vector<int> vec[MAXN];
 int dp[MAXN][2];   //i号职员去(1)或不去(0)的快乐指数
 
 void dfs(int u)
 {
     dp[u][0]=0;
     dp[u][1]=r[u];
     for (int i=0;i<(int)vec[u].size();i++)
     {
         int v=vec[u][i];
         dfs(v);
         //类似pushUp,求出子树的dp再向上更新根结点的dp
         dp[u][0]+=max(dp[v][0],dp[v][1]);
         dp[u][1]+=dp[v][0];
     }
     return;
 }
 
 int main()
 {
     scanf("%d",&n);
     for (int i=1;i<=n;i++) scanf("%d",&r[i]);
     memset(flag,false,sizeof(flag));
 
     for (int i=1;i<n;i++)
     {
         int l,k;
         scanf("%d%d",&l,&k);
         vec[k].push_back(l);
         flag[l]=true;
     }
 
     int rt;
     for (int i=1;i<=n;i++)   //求根结点(校长)
     {
         if (!flag[i])
         {
             rt=i;
             break;
         }
     }
 
     dfs(rt);
     printf("%d\\n",max(dp[rt][1],dp[rt][0]));
 
     return 0;
 }

 

以上是关于树形dp的主要内容,如果未能解决你的问题,请参考以下文章

Starship Troopers(HDU 1011 树形DP)

HDU1520 Anniversary party(树形dp入门题)

[填坑][支线任务]树形DP 树形背包

hdu1561 树形dp+背包

BZOJ_1060_时态同步_树形DP

HDU 1520 Anniversary party (树形DP)