zoukankan      html  css  js  c++  java
  • HDU 1520Anniversary party(树型DP)

    HDU 1520   Anniversary party

    题目是说有N个人参加party,每个人有一个rating值(可以理解为权值)和一个up(上司的编号),为了保证party的趣味性,每一个人不可以和他的直接上司都参加,问最后的rating和最大

    这是一个典型的树形DP,DP[i][0]表示i不参加那他的这棵子树上的最大权值,DP[i][1]表示i参加时的这棵树上的最大权值,那么:

            DP[i][0] = sum{MAX(DP[j][1], DP[j][0])  |  j是i的直接子节点}

            DP[i][1] = sum{DP[j][0]  |  j是i的直接子节点}        

     1 //#pragma comment(linker,"/STACK:102400000,102400000")
     2 #include <map>
     3 #include <set>
     4 #include <stack>
     5 #include <queue>
     6 #include <cmath>
     7 #include <ctime>
     8 #include <vector>
     9 #include <cstdio>
    10 #include <cctype>
    11 #include <cstring>
    12 #include <cstdlib>
    13 #include <iostream>
    14 #include <algorithm>
    15 using namespace std;
    16 #define INF 1e9
    17 #define inf (-((LL)1<<40))
    18 #define lson k<<1, L, mid
    19 #define rson k<<1|1, mid+1, R
    20 #define mem0(a) memset(a,0,sizeof(a))
    21 #define mem1(a) memset(a,-1,sizeof(a))
    22 #define mem(a, b) memset(a, b, sizeof(a))
    23 #define FOPENIN(IN) freopen(IN, "r", stdin)
    24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
    25 template<class T> T CMP_MIN(T a, T b) { return a < b; }
    26 template<class T> T CMP_MAX(T a, T b) { return a > b; }
    27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
    28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
    29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
    30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
    31 
    32 //typedef __int64 LL;
    33 //typedef long long LL;
    34 const int MAXN = 6010;
    35 const int MAXM = 100005;
    36 const double eps = 1e-13;
    37 //const LL MOD = 1000000007;
    38 
    39 int N, a[MAXN], dp[MAXN][2];
    40 int fa[MAXN];
    41 vector<int>e[MAXN];
    42 
    43 void DFS(int u)
    44 {
    45     int s0 = 0, s1 = 0;
    46     for(int i=0;i<e[u].size();i++)
    47     {
    48         DFS(e[u][i]);
    49         s0 += MAX( dp[e[u][i]][0], dp[e[u][i]][1] );
    50         s1 += dp[e[u][i]][0];
    51     }
    52     dp[u][0] = s0;
    53     dp[u][1] = s1 + a[u];
    54 }
    55 
    56 int main()
    57 {
    58     //FOPENIN("in.txt");
    59     while(~scanf("%d", &N))
    60     {
    61         mem0(dp);
    62         for(int i=1;i<=N;i++)
    63         {
    64             scanf("%d", &a[i]);
    65             fa[i] = i;
    66             e[i].clear();
    67         }
    68         int x, y;
    69         while(scanf("%d %d", &x, &y) && (x||y) ){
    70             e[y].push_back(x);
    71             fa[x] = y;
    72         }
    73         int ans = 0;
    74         for(int i=1;i<=N;i++) if(fa[i] == i)
    75         {
    76             DFS(i);
    77             ans += MAX(dp[i][0], dp[i][1]);
    78         }
    79         printf("%d
    ", ans);
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    [CentOS7] 安装sogou输入法
    [CentOS7] vncviewer与windows之间的复制粘贴
    linux solr7.2+tomcat8 详细部署整合
    linux solr 安装
    linux dubbo-admin-2.6.0 环境搭建
    linux tomcat安装
    linux jdk安装
    linux Nginx-1.10.2 安装部署教程
    linux技巧---创建应用快捷方式
    linux MySQL 5.7+keepalived 主备服务器自主切换
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/3888293.html
Copyright © 2011-2022 走看看