树形DP 没有上司的舞会
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形DP 没有上司的舞会相关的知识,希望对你有一定的参考价值。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 7 using namespace std; 8 int n; 9 int root; 10 struct data{ 11 int val; 12 int fa; 13 vector<int> ch; 14 }t[10010]; 15 int f[10010][2]; 16 17 void dp(int x){ 18 f[x][1]=t[x].val; 19 f[x][0]=0; 20 if(t[x].ch.empty()) return; 21 for(int i=0;i<t[x].ch.size();i++){ 22 int q=t[x].ch[i]; 23 dp(q); 24 f[x][0]=max(f[x][0],max(f[x][0]+f[q][1],f[x][0]+f[q][0]));//不选x 选儿子q?不选儿子q? 25 f[x][1]=max(f[x][1],f[x][1]+f[q][0]);//选x 必不可选其父和子 26 } 27 return; 28 } 29 30 int main(){ 31 scanf("%d",&n); 32 for(int i=1;i<=n;i++) scanf("%d",&t[i].val); 33 int x=0,y=0; 34 for(int i=1;i<=n;i++){//=n吞0 0 35 scanf("%d%d",&x,&y); 36 t[x].fa=y; 37 t[y].ch.push_back(x); 38 } 39 root=1; 40 while(t[root].fa) root=t[root].fa; 41 dp(root); 42 printf("%d\n",max(f[root][0],f[root][1])); 43 return 0; 44 }
以上是关于树形DP 没有上司的舞会的主要内容,如果未能解决你的问题,请参考以下文章