树形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)