首页 > 其他分享 >P1352 没有上司的舞会

P1352 没有上司的舞会

时间:2023-10-02 09:24:44浏览次数:37  
标签:pre 舞会 上司 int max P1352 节点 deg

考察算法:树形 \(DP\)。

题目概述

给你一个树,每个结点有一个“上司”。每个节点都有一个快乐指数 \(h_i\)。

但是,如果有某个节点的上司(父亲),已经来到了舞会,那么它的儿子就不能去了。

求:最大的快乐指数(所有人的快乐指数之和)。

思路

树形 \(DP\)。设 \(f_{i,0}\) 表示以 \(i\) 作为根节点,不去舞会时的最大欢乐指数。反之,\(f_{i,1}\) 表示 \(i\) 去舞会时,最大的快乐指数。

答案为:\(max(f_{r,0},f_{r,1})\)。\(r\) 代表该树的根。

边界条件:

如果该节点 \(u\) 为叶子节点,则:不去的话没人去,去的话就自己。\(f_{u,0} = 0;f_{u,1} = r_u\)。

状态转移方程设计:

  • 如果结点 \(x\) 不去,则它的儿子们去不去都行。\(f_{x,0} += max(f_{u,0},f_{u,1})\)。
  • 如果 \(x\) 去,则它的儿子们必须不去。\(f_{x,1} += f_{u,0}\)。

\(u\) 代表 \(x\) 的每一个子节点。

最后,搞定 \(AC\) !

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 6e3 + 10;
int Happy[N], deg[N], fa[N]; // deg[] 表示每一个节点的度。
int n, f[N][2];

// 链式前向星
struct node {
    int to, next;
} a[N];
int pre[N], k, father, son;

void add(int x, int y) {
    a[++k] = (node){y, pre[x]};
    pre[x] = k;
    fa[y] = x;
    deg[x]++; // 记录出边
}

void dfs(int x) {
    for (int i = pre[x]; i; i = a[i].next) {
        int to = a[i].to;
        dfs(to);
        f[x][0] += max(f[to][0], f[to][1]); // 这个点不来,儿子来不来都行,去max
        f[x][1] += f[to][0]; // 这个点来,儿子不能来
    }
    f[x][1] += Happy[x];
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &Happy[i]);
    for (int i = 1; i < n; i++) {
        scanf("%d%d", &son, &father);
        add(father, son);
    }
    int ans;
    for (int i = 1; i <= n; i++) {
        if (!fa[i]) { // 这个点是根,从根开始搜。
            dfs(i);
            ans = max(f[i][0], f[i][1]);
            break;
        }
    }
    printf("%d", ans);
    return 0;
}

标签:pre,舞会,上司,int,max,P1352,节点,deg
From: https://www.cnblogs.com/yhx0322/p/17739707.html

相关文章

  • Luogu P1352没有上司的舞会
    分析树形dp。定义状态\(dp_{~i,~0}\)为在以\(i\)为根节点的子树中,不选第\(i\)个人的最大快乐值,\(dp_{~i,~1}\)为在以\(i\)为根节点的子树中,选第\(i\)个人的最大快乐值。寻找根节点,然后从根节点开始dfs,当前节点\(u\)的\(dp\)初始状态为\(dp_{~i,~0}=0,~dp_{~i......
  • 题解 P1538 【迎春舞会之数字舞蹈】
    postedon2021-06-0113:24:05|under题解|source给\(0\cdots9\)每个数字打表,打它在相应的位置有没有一划。然后把每个数字分成\(5\)部分,暴力输出即可。#include<cstdio>#include<cstring>usingnamespacestd;constchar*db[]={"-||||-","||"......
  • 没有上司的舞会 - 树形动态规划
    没有上司的舞会-树形动态规划题意某大学有\(n\)个职员,编号为\(1\ldotsn\)。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数\(r_i\),但是呢,如果某个职员的直接......
  • 1538 迎春舞会之数字舞蹈 题解
    #include<iostream>intmain(){/**#Seven-segmentDisplay**Thewayhowtheprogramprintsdecimalnumericstotheconsoleworks......
  • P1352 没有上司的舞会+P1122 最大子树和(树形DP入门)
    前言今日偶然打开\(oi-wiki\),发现树形\(DP\)例题正好是之前在洛谷上鸽着的一道题。所以......\(\color{red}{很高兴以这样的方式认识你,树形DP!}\)这例题造的太好了......
  • 我与外企上司的四个职场故事
    标题:我与外企上司的四个职场故事我在目前这家任职的外企从事软件开发工作,已经整整十五年了。本系列文章通过介绍我与自己上司的四个职场小故事,想和大家分享在外企里,一个程......
  • 没有上司的舞会
    题目链接:https://www.acwing.com/problem/content/287/题目描述Ural大学有N名职员,编号为1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每......
  • P1352 没有上司的舞会
    P1352题目的dfs函数与骑士......
  • P4062 [Code+#1]Yazid 的新生舞会
    P4062[Code+#1]Yazid的新生舞会分析这个题目还是很有意思的,我们来一步步分析一下。首先,我们来定一下我们的解题方向。涉及到众数,我们一般是考虑从每一个数字去考虑。......
  • P1352 没有上司的舞会
    #include<bits/stdc++.h>usingnamespacestd;classDP_on_tree{public: intn; inta[6001]; intvis[6001]; intf[6001][3]; vector<int>e[6001]; voidDP......