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

    题目描述

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

    思路

    $ f_{x,0/1} $表示以x为根的子树,且x不参加(0)参加(1)舞会的最大快乐值

    则 $f_{x,0} = sum_{y in son(x)}^{ } max { f_{y,0},f_{y,1} }$

         $f_{x,1} = {sum_{y in son(x)}^{ }f_{y,0} }   + R_{x}$

    答案为$ max { f_{root,0},f_{root,1} }  $

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 6000 + 10;
    int n,dp[maxn][2],r[maxn],root;
    vector<int> edges[maxn];
    bool vis[maxn];
    inline void dfs(int now) {
        dp[now][1] = r[now];
        for (size_t i = 0;i < edges[now].size();i++) {
            int to = edges[now][i];
            dfs(to);
            dp[now][0] += max(dp[to][0],dp[to][1]);
            dp[now][1] += dp[to][0];
        }
    }
    int main() {
        scanf("%d",&n);
        for (int i = 1;i <= n;i++) scanf("%d",&r[i]);
        for (int i = 1,x,y;i <= n;i++) {
            scanf("%d%d",&x,&y);
            edges[y].push_back(x);
            vis[x] = true;
        }
        for (int i = 1;i <= n;i++) if (!vis[i]) { root = i; break; }
        dfs(root);
        printf("%d",max(dp[root][0],dp[root][1]));
        return 0;
    }
  • 相关阅读:
    []==![] 为什么等于true?
    this指向问题
    Git的基本了解与使用、向github提交代码
    Javascript实现多行字符串
    常见浏览器兼容性问题与解决方案?
    Scapy——Scrapy shell的使用
    Python中单下划线和双下划线
    Python中@staticmethod和@classmethod的作用和区别
    Python多进程、多线程和协程简介
    精简Docker镜像的几个方法
  • 原文地址:https://www.cnblogs.com/lrj124/p/8973876.html
Copyright © 2011-2022 走看看