• 洛谷P1352 CodeVS1380 没有上司的舞会


    Description

    某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

    Input

    第一行一个整数N。(1<=N<=6000)

    接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

    接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

    最后一行输入0 0

     Output

    输出最大的快乐指数。

    Sample Input
    7
    1
    1
    1
    1
    1
    1
    1
    1 3
    2 3
    6 4
    7 4
    4 5
    3 5
    0 0

    Sample Output
    5

    
    
    PS:本来NOIp前不打算写题解的...结果又学了点新东西...是该开心呢还是该慌呢...
    树形DP入门题吧应该算是;
    选了父亲不能选儿子,选了儿子不能选父亲->f[i][1/0] 节点i选或不选的最大答案;
    DFS一遍回溯时更新即可(选自己时也要把自己加上);
    代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 
     5 const int maxn = 6000 + 5;
     6 struct Edge
     7 {
     8     int f, t;
     9 }gra[maxn << 1];
    10 int n, arr[maxn], u;
    11 int fir[maxn], nxt[maxn << 1];
    12 int f[maxn][2];//1 选, 0 不选
    13 void Build(int, int), DFS(int, int);
    14 
    15 int main()
    16 {
    17     memset(fir, -1, sizeof(fir));
    18     scanf("%d", &n);
    19     for(int i = 1; i <= n; i++)
    20         scanf("%d", &arr[i]);
    21     for(int i = 1; i <= n; i++)
    22     {
    23         int f, t;
    24         scanf("%d%d", &f, &t);
    25         if(f&&t) Build(f, t);
    26     }
    27     DFS(1, 0);
    28     std::cout << std::max(f[1][1], f[1][0]);
    29     return 0;
    30 }
    31 
    32 void DFS(int k, int fa)
    33 {
    34     for(int i = fir[k]; ~i; i = nxt[i])
    35     {
    36         int tmp = gra[i].t;
    37         if(tmp == fa) continue;
    38         DFS(tmp, k);
    39         f[k][0] += std::max(f[tmp][1], f[tmp][0]);
    40         f[k][1] += f[tmp][0];
    41     }
    42     f[k][1] += arr[k];
    43 }
    44 
    45 void Build(int f, int t)
    46 {
    47     gra[++u] = (Edge){f, t};
    48     nxt[u] = fir[f], fir[f] = u;
    49     gra[++u] = (Edge){t, f};
    50     nxt[u] = fir[t], fir[t] = u;
    51 }
     
  • 相关阅读:
    二叉树解题思想
    SpringBoot + Mybatis 和ssm 使用数据库的区别
    Spring Cache 抽象(缓存抽象) Redis 缓存
    VirtualBox 虚拟机 从入门到入坑
    小知识点的记录
    SpringBoot 的不同
    请你激起学习的激情
    java 适配器模式
    UML类图的情话诉说
    Java 工厂模式
  • 原文地址:https://www.cnblogs.com/DreifxP/p/7788454.html
Copyright © 2020-2023  润新知