首页 > 代码库 > 树形DP 没有上司的舞会
树形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 没有上司的舞会
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。