zoukankan      html  css  js  c++  java
  • TTTTTTTTTTT hdu 1520 Anniversary party 生日party 树形dp第一题

    Anniversary party

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8667    Accepted Submission(s): 3748

    Problem Description
    There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests' conviviality ratings.
     
    Input
    Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:  L K  It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line  0 0
     
    Output
    Output should contain the maximal sum of guests' ratings.
     
    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
     
    Source
     
    题目大意是,有一群人之间有上下级关系,在一个 party 中,有直接的上下级关系(即树中的父子关系)的人不能同时出席,每个人都有个 rating ,闻如何选择出席的人,使得所有人的 rating 之和最大
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long Ull;
    #define MM(a,b) memset(a,b,sizeof(a));
    const double eps = 1e-10;
    const int  inf =0x7f7f7f7f;
    const double pi=acos(-1);
    const int maxn=40000;
    
    int n,x,y,a[6005],dp[6005][3],indeg[6005];
    vector<int> G[6005];
    int solve()
    {
        int ans=0;
        queue<int> q;
        for(int i=1;i<=n;i++)
          {
              ans=max(ans,a[i]);
              dp[i][1]=a[i];
              dp[i][0]=0;
              if(!indeg[i])  {q.push(i);}
          }
        while(q.size())
        {
          int u=q.front();q.pop();
          for(int i=0;i<G[u].size();i++)
          {
              int v=G[u][i];
              dp[v][0]+=max(dp[u][0],dp[u][1]);
              dp[v][1]+=dp[u][0];
              indeg[v]--;
              if(!indeg[v]) q.push(v);
              ans=max(ans,max(dp[v][0],dp[v][1]));
          }
        }
        return ans;
    }
    int main()
    {
        while(~scanf("%d",&n))
        {
            for(int i=1;i<=n;i++) {G[i].clear();scanf("%d",&a[i]);}
            MM(indeg,0);
            for(;;)
            {
                scanf("%d %d",&x,&y);
                if(!x&&!y) break;
                G[x].push_back(y);
                indeg[y]++;
            }
            printf("%d
    ",solve());
        }
        return 0;
    }
    

    分析:应该是最基础的树形dp吧,按照DAG建好图后,从叶子节点u考虑(其只能为子节点),设

            dp[u][0]为不选u节点时所能得到的最大rating

            dp[u][1]为选u节点所能得到的最大rating

    对于其父节点v构建状态转移方程:

           dp[v][0]+=max(dp[u][0],dp[u][1]);(只能选其中一个)

           dp[v][1]+=dp[u][0];

    最后按照DAG往上扫上去就好

  • 相关阅读:
    线程与进程
    进程间通信之信号量与信号灯
    进程间通信之消息队列
    进程间通信之共享内存
    进程间通信之信号
    进程间通信之管道
    软件需求分析
    团队介绍
    EF Core(1.DBFirst)
    7.基本方式调用Api(http api)
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5657256.html
Copyright © 2011-2022 走看看