zoukankan      html  css  js  c++  java
  • 5829: 没有上司的舞会 (树形DP入门)

    5829: 没有上司的舞会 分享至QQ空间

    时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
    总提交: 31            测试通过:22

    描述

     

    Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 H_i 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

    输入

     

    第一行一个整数N。(1<=N<=6000)
    接下来N行,第i+1行表示i号职员的快乐指数H_i。(-128<=H_i<=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

    题目来源

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n;
     5 const int maxn=6005;
     6 int arr[maxn];
     7 vector<int> G[maxn];
     8 int dp[maxn][2],in[maxn];
     9 
    10 void dfs(int ee){
    11     dp[ee][0]=0;
    12     dp[ee][1]=arr[ee];
    13     for(int x:G[ee]){
    14         dfs(x);
    15         dp[ee][0]+=max(dp[x][1],dp[x][0]);  //有两种悬着
    16         dp[ee][1]+=dp[x][0];
    17     }
    18 }
    19 
    20 int main()
    21 {
    22     ios::sync_with_stdio(false);
    23     cin>>n;
    24     for(int i=1;i<=n;i++) cin>>arr[i];
    25     for(int i=1,d1,d2;i<=n;i++){
    26         cin>>d1>>d2;
    27         G[d2].push_back(d1);
    28         in[d1]++;
    29     }
    30     int root;
    31     for(int i=1;i<=n;i++){
    32         if(in[i]==0) {root=i;break;}  //找入读为0的根
    33     }
    34     dfs(root);
    35     cout << max(dp[root][0],dp[root][1]) << endl;
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    淘宝Banner 轮播图
    JavaScript move简易版运动框架封装
    javaScript 导航栏
    JS 运动框架完整版
    Js 数组操作
    JS 动画轮播效果
    JavaScritpt 字符串操作
    Java AOP切面编程方式
    时间版 运动框架
    Nmon的安装及使用
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11937870.html
Copyright © 2011-2022 走看看