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

    题目描述

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

    输入输出格式

    输入格式:

     

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

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

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

    最后一行输入0 0

     

    输出格式:

     

    输出最大的快乐指数。

    输入输出样例

    输入样例#1: 
    7
    1
    1
    1
    1
    1
    1
    1
    1 3
    2 3
    6 4
    7 4
    4 5
    3 5
    0 0


    输出样例#1: 
    5



    树型dp入门题。
    对于树中的每一个点,要么选,要么不选。若选的话,他的孩子节点一定不能选;不选的话,他的孩子节点可以选或不选。

    所以开一个二维数组,其中 dp[i][0] 代表在i没选的情况下,dp[i][1]是选了的情况下。

    那么转移方程
      dp[i][0] = sum(max(dp[j][0], dp[j][1]));
      dp[i][1] = sum(dp[j][1]) + a[i];


    思路是dfs。回溯的时候进行计算。
    当递归到叶节点的时候,若没取,返回0;否则返回a[i]。
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<vector>
     7 using namespace std;
     8 const int maxn = 1e4 + 5;
     9 int a[maxn], pa[maxn], n;
    10 vector<int>v[maxn];
    11 int dp[maxn][2];
    12 int dfs(int now, int flag)
    13 {
    14     if(!(int)v[now].size()) return a[now] * flag;
    15     if(dp[now][flag]) return dp[now][flag];        //若已经找过,就直接返回 
    16     for(int i = 0; i < (int)v[now].size(); ++i)
    17     {
    18         if(flag) dp[now][flag] += dfs(v[now][i], 0);
    19         else dp[now][flag] += max(dfs(v[now][i], 1), dfs(v[now][i], 0));
    20     }
    21     if(flag) dp[now][flag] += a[now];
    22     return dp[now][flag];
    23 }
    24 int main()
    25 {
    26     scanf("%d", &n);
    27     for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    28     for(int i = 1; i < n; ++i)
    29     {
    30         int a, b; scanf("%d%d", &b, &a);
    31         v[a].push_back(b); pa[b]++;
    32     }
    33     int x = 1;
    34     while(pa[x]) x++;        //找根节点 
    35     v[0].push_back(x);        //理论上取max(dfs(1, 1),dfs(1, 0))),但事实上可以给节点加一个父亲,然后直接dfs(0, 0); 
    36     printf("%d
    ", dfs(0, 0));
    37     return 0;
    38 }



  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/mrclr/p/8832027.html
Copyright © 2011-2022 走看看