树形dp--hdu 1520 anniversary party

题意:一个大学准备举办80周年校庆活动。该校的人事关系是一棵树形结构,父结点是上司,子结点是下属。每个结点都有一个值,限制条件是父子结点不能同时参加校庆活动(即如果父结点参加了那么他的孩子结点就不能参加,如果有一个孩子结点参加,那么父结点就不能参加)。最后求满足限制的情况下,值的和最大的值是多少。

f[N]:表示i结点的父结点;

rating[N]:一个结点的值

dp[i][0]:以i为根结点的子树所取的最大值(i结点没有被取到)

dp[i][1]:以i为根结点的子树所取的最大值(i结点被取到)

状态转移方程:

dp[root][0] += max(dp[children[root][i]][0], dp[children[root][i]][1]);
dp[root][1] += dp[children[root][i]][0];

最后的结果是包含根结点的最大值和不包含根结点的最大值中的一个。

#include<vector>
#include<cstdio>
using namespace std;

const int N = 6005;

int f[N];
int ratings[N];
vector<int> children[N];
int dp[N][2];

int max(int a, int b){
    return a > b ? a : b;
}

void dfs(int root){
    int len = children[root].size();
    dp[root][1] = ratings[root];
    for (int i = 0; i < len; ++i){
        dfs(children[root][i]);
    }
    for (int i = 0; i < len; ++i){
        dp[root][0] += max(dp[children[root][i]][0], dp[children[root][i]][1]);
        dp[root][1] += dp[children[root][i]][0];
    }
}

int main(){
    int n, a, b;
    while (scanf("%d", &n) != EOF){
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= n; ++i){
            scanf("%d", &ratings[i]);
            f[i] = -1;
        }
        while (scanf("%d%d", &a, &b)){
            if (a == 0 && b == 0) break;
            f[a] = b;
            children[b].push_back(a);
        }
        int root = 1;
        while (f[root] != -1) root = f[root];
        dfs(root);
        printf("%d\n", max(dp[root][0], dp[root][1]));
    }
    return 0;
}
时间: 2024-10-07 22:31:18

树形dp--hdu 1520 anniversary party的相关文章

(树形DP) hdu 1520

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5619    Accepted Submission(s): 2580 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

HDU 1520 Anniversary party 树DP水题

非常水的树DP,状态为当前为i,上级来没来 然后跑一遍记忆化搜索即可 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib>

fwt优化+树形DP HDU 5909

1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include <bits/stdc++.h> 6 // #include <iostream> 7 // #include <cstdio> 8 // #include <cstdlib> 9 // #include <algorithm> 10 // #inc

HDU 1520.Anniversary party 基础的树形dp

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12770    Accepted Submission(s): 5142 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

hdu 1520 Anniversary party(第一道树形dp)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16376    Accepted Submission(s): 6241 Problem Description There is going to

POJ 2342 &amp;&amp;HDU 1520 Anniversary party 树形DP 水题

一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点)都不能被邀请 2.每一个员工都有一个兴奋值,在满足1的条件下,要使得邀请来的员工的兴奋值最高 输出最高的兴奋值. 简单的树形DP dp[i][1]:表示以i为根的子树,邀请节点i的最大兴奋值 dp[i][0]:表示以i为根的子树,不邀请节点i的最大兴奋值 先根据入度找出整棵树的根节点, 然后一次DF

HDU 1520 Anniversary party(DFS或树形DP)

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.

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

HDU 1520 Anniversary party (树形DP)

树形DP的关键在于如何处理递归返回的信息.这题dp[i][0]表示不选i点时当前最高权值.dp[i][1]表示选i点时当前最高权值.状态转移方程:dp[u][[0]+=max(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0]; 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm&

HDU 1520 Anniversary party

http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意: 将有一个党庆祝乌拉尔国立大学80周年.大学有一个员工的层次结构.这意味着监督关系形成了一个树根源于校长VE Tretyakov.为了使党对每个人都有趣,主任不想让一个雇员和他或她的直接主管在场.人事局已评估每个员工的欢乐性,所以每个人都有一定数量(评级)附加到他或她.你的任务是制作一个客人的列表,其中有最大可能的客人的欢乐度评分的总和. 思路: 这道题目就是UVa 1220的减弱版,比较基本的树