zoukankan      html  css  js  c++  java
  • 没有上司的舞会

    【题目描述】

    有N个职员,编号为1~N,他们有从属关系,就像一棵树,父结点就是子结点的直接上司,每个职员有一个快乐指数。

    现有一个舞会,需要与会职员的快乐指数总和最大,但是,没有职员愿意和直接上司一起与会。

    【输入描述】

    第一行输入一个整数N(1 <= N <= 6000);

    接下来N行,每行输入一个整数,表示职员的快乐指数Ri(-128 <= Ri <= 127);

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

    最后一行输入0、0。

    【输出描述】

    输出一个数,表示最大的快乐指数总和。

    【样例输入】

    7

    1

    1

    1

    1

    1

    1

    1

    1 3

    2 3

    6 4

    7 4

    4 5

    3 5

    0 0

    【样例输出】

    5

    源代码:
    
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,t1,t2,root=1,f[6001][2]={0},father[6001]={0}; //数组范围!不要吝惜空间!
    void DP(int t) //树形DP。
    {
        for (int a=1;a<=n;a++)
          if (father[a]==t) //判断是否为其直属部下。
          {
              DP(a); //递归到叶节点,后回溯求解。
              f[t][1]+=f[a][0]; //编号为t的职员若来,则应加上他的直属部下不来的解。
              f[t][0]+=max(f[a][1],f[a][0]); //若不来,则在他的直属部下来与不来的解中取最优值。
          }
    }
    int main()
    {
        scanf("%d",&n);
        for (int a=1;a<=n;a++)
          scanf("%d",&f[a][1]); //编号为a的职员来时增加的欢乐度。
        scanf("%d%d",&t1,&t2);
        while (t1)
        {
            father[t1]=t2;
            scanf("%d%d",&t1,&t2);
        }
        while (father[root]) //寻找根节点。
          root=father[root];
        DP(root);
        printf("%d",max(f[root][1],f[root][0]));
        return 0;
    }
  • 相关阅读:
    获取成本
    销售订单跟踪成本
    装机
    这就是用战术上的勤奋掩盖战略上的懒惰
    CPA-计划(参考)
    大帝名言
    BZOJ 2100: [Usaco2010 Dec]Apple Delivery spfa
    BZOJ 2834: 回家的路 Dijkstra
    BZOJ 4070: [Apio2015]雅加达的摩天楼 根号分治+spfa
    BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5566881.html
Copyright © 2011-2022 走看看