首页 > 编程语言 >算法学习笔记(49)——树形DP

算法学习笔记(49)——树形DP

时间:2023-01-07 18:33:33浏览次数:62  
标签:le idx 49 int 树形 DP root 职员 为根

树形DP

题目链接:AcWing 285. 没有上司的舞会

题目描述

Ural 大学有 \(N\) 名职员,编号为 \(1∼N\)。

他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。

每个职员有一个快乐指数,用整数 \(H_i\) 给出,其中 \(1 \le i \le N\)。

现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。

在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

输入格式

第一行一个整数 \(N\)。

接下来 \(N\) 行,第 \(i\) 行表示 \(i\) 号职员的快乐指数 Hi。

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

输出格式

输出最大的快乐指数。

数据范围

\(1 \le N \le 6000\),

\(−128 \le H_i \le 127\)

输入样例

7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5

输出样例

5

状态表示

f[u,0]表示所有从以u为根的子树中选择,并且不选择u这个点的方案
f[u,1]表示所有从以u为根的子树中选择,并且选择u这个点的方案

状态转移:(\(s\)表示\(u\)的孩子节点)

\[\begin{align*} &f(u, 0) = \sum \max(f(s_i,0), f(s_i,1)) \\ &f(u, 1) = \sum f(s_i, 0) + 1 \end{align*} \]

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 6010;

int n;
int happy[N];
int h[N], e[N], ne[N], idx;
int f[N][2];
bool has_father[N];

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dfs(int u)
{
    f[u][1] = happy[u];
    
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
        dfs(j);
        
        f[u][0] += max(f[j][0], f[j][1]);
        f[u][1] += f[j][0];
    }
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> happy[i];
    
    memset(h, -1, sizeof h);
    for (int i = 0; i < n - 1; i ++ ) {
        int a, b;
        cin >> a >> b;
        has_father[a] = true;
        add(b, a);
    }
    
    int root = 1;
    while (has_father[root]) root ++;
    
    dfs(root);
    
    cout << max(f[root][0], f[root][1]) << endl;
    
    return 0;
}

标签:le,idx,49,int,树形,DP,root,职员,为根
From: https://www.cnblogs.com/I-am-Sino/p/17033227.html

相关文章

  • 2023.1.7 DP 学习日志
    上午编辑距离(AcWing.899)思路:同最短编辑距离,只不过要做\(m\)次。code:#include<bits/stdc++.h>#definelllonglong#defineN1005usingnamespacestd;inlinel......
  • DPlayer播放器H5页面实现视频全屏播放滑动操作(滑动快进,滑动音量增减)
     官方文档:https://dplayer.diygod.dev/zh/guide.html#%E5%8F%82%E6%95%B0 player.on('fullscreen',function(){$("body").on("touc......
  • WordPress 版本更新
    WordPress是一个内容管理系统(WCM),即它是一种以最佳方式组织创建、存储和展示Web内容的整个过程的工具。WordPress作为一种改进工具开始了它的旅程,以增强日常写作的常......
  • 【哈希表】LeetCode 49. 字母异位词分组
    题目链接49.字母异位词分组思路如果一对字符串是字母异位词,那么他们经过排序之后,应该是相等的。利用这一特点,我们通过哈希表建立排序后字符串到原字符串列表的映射,不......
  • C++ - TCP/UDP网络编程
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>......
  • 高维前缀和与 SOSDP
    高维前缀和高维前缀和,就是对每一个高维空间的点\((a_1,a_2,\cdots,a_k)\),求\(\displaystyle\sum_{b_1=0}^{a_1}\sum_{b_2=0}^{a_2}\cdots\sum_{b_k=0}^{a_k}val_{(......
  • 洛谷P2949 Work Scheduling G
    [洛谷P2949WorkSchedulingG]([P2949USACO09OPEN]WorkSchedulingG-洛谷|计算机科学教育新生态(luogu.com.cn))[USACO09OPEN]WorkSchedulingG题面翻译约翰......
  • 内网渗透-RDP&SPN
    什么是SPNWindows域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散、所属部门不同的用户进行分组,集中资源,有效地对资源访问控制权限进行细粒度的分......
  • DP--数字三角形模型
    摘花生#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1010;intf[N][N],T,n,m,w[N][N];intmain(){......
  • m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真
    1.算法描述从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。这里,我们采用如下的数据帧......