首页 > 其他分享 >奇怪的花卉(树形DP——最大子树和)

奇怪的花卉(树形DP——最大子树和)

时间:2024-08-28 21:21:46浏览次数:6  
标签:修剪 子树 int 朵花 树形 maxn DP include dp

题意

小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:

一株奇怪的花卉,上面共连有 N 朵花,共有 N−1 条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个“美丽指数”,该数越大说明这朵花越漂亮,也有“美丽指数”为负数的,说明这朵花看着都让人不舒服。所谓“修剪”,意为:去掉其中的一条枝条,这样一株花就成了两株,扔掉其中一株。经过一系列“修剪“之后,还剩下最后一株花(也可能是一朵)。老师的任务就是:通过一系列“修剪”(也可以什么“修剪”都不进行),使剩下的那株(那朵)花卉上所有花朵的“美丽指数”之和最大。

老师想了一会儿,给出了正解。小明见问题被轻易攻破,相当不爽,于是又拿来问你。

输入格式

第一行一个整数 N (1≤N≤16000),表示原始的那株花卉上共 N 朵花。

第二行有 N 个整数,第 i 个整数 ai​ (−104≤ai​≤104)表示第 i 朵花的美丽指数。

接下来 N−1 行每行两个整数 a,b,表示存在一条连接第 a 朵花和第 b 朵花的枝条。

输出格式

一个数,表示一系列“修剪”之后所能得到的“美丽指数”之和的最大值。

解析

树上问题往往从根结点开始,由子树逐渐往上更新到整棵树。

这里我们不妨先设 11 为根。设 dp[u] 表示以 u 为根的子树在保留 u 节点的情况下完成“修剪“后”美丽指数”之和最大是多少。

转移时我们发现如果对于 u 的子节点 v,有 dp[v]>0,那么 (u,v) 这条边就不该剪,所以状态转移方程为:

dp[u]=a[u]+∑dp[v]>0​dp[v]

我们找到 dp 数组的最大值即可。

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 16010;
vector <int> G[maxn];
int a[maxn], dp[maxn];
void addedge(int u, int v) {
    G[u].push_back(v);
}
int dfs(int u, int fa) {
    dp[u] = a[u];
    for(int i = 0; i < G[u].size(); i++){
        int v = G[u][i];
        if (v != fa && dfs(v, u) > 0){
            dp[u] += dp[v];
        }
    }
    return dp[u];
}
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        addedge(u, v);
        addedge(v, u);
    }
    dfs(1, 0);
    int ans = -inf;
    for(int i = 1; i <= n ;i++){
        ans = max(ans, dp[i]);
    }
    cout << ans << endl;
    return 0;
}

 

标签:修剪,子树,int,朵花,树形,maxn,DP,include,dp
From: https://blog.csdn.net/yymer214/article/details/141650168

相关文章

  • 树形 DNA
    由于左右子树不等价,我们可以以Trie树的视角考察原树,发现“叶子节点不超过20个”的条件等价于这棵Trie树可以用不超过20个01字符串表示树的匹配不好做,但字符串匹配是可做的。于是我们可以想到把树的匹配“折叠”成20个字符串的匹配猜想时间复杂度是O(20n),其中20是枚举的复杂度把......
  • UDP-6-Biotinyl-GlcNAc中生物素化修饰对糖蛋白的功能具有哪些影响?
    UDP-6-Biotinyl-GlcNAc中生物素化修饰对糖蛋白的功能具有哪些影响?UDP-6-Biotinyl-GlcNAc是一种具有特定化学结构的分子。一、分子结构特点它由尿苷二磷酸(UDP)、6-生物素修饰基团以及N-乙酰葡糖胺(GlcNAc)组成。结构式:二、作用与用途1.在生物学研究中,常被用作工具分子......
  • 在生物体内UDP-2-Biotinyl-GlcNAc是如何被代谢的?
    在生物体内UDP-2-Biotinyl-GlcNAc是如何被代谢的?UDP-2-Biotinyl-GlcNAc是一种具有特定化学结构和重要生物学功能的分子。一、分子结构特点它由尿苷二磷酸(UDP)、2-生物素修饰基团和N-乙酰葡糖胺(GlcNAc)组成。这种独特的结构使其在糖基化研究和生物技术领域中具有重要价值......
  • [2024最新整理]300多个地级市GDP及第一、二、三产业占比数据(1990-2021年)
    文章目录数据下载地址数据指标说明项目备注数据下载地址数据下载地址点击这里下载数据数据指标说明梳理了2021年普通地级市GDP30强,其中有26个城市GDP总量超过了5000亿元,更有6个城市超过了万亿元,分别是苏州、无锡、佛山、泉州、南通、东莞;从省份来看,30强中江苏有......
  • 协议汇总 TCP、UDP、Http、Socket、Web Scoket、Web Service、WCF、API
    TCP:(1)位于OSI传输层,基于soap(信封)协议;(2)数据格式是xml、Json;(3)是面向连接的,需要先建立连接;(4)TCP协议是一个可靠的传输协议,它可以保证传输的一个正确性,保证我们的不丢包不重复,而且数据是按顺序到达的,保证不丢包(握手需要三次,挥手却要四次);(5)典型的TCP/IP之上的协议有FTP、......
  • LOJ #160. 树形背包 题解
    Description有\(N\)个物品,编号分别为\(1\ldotsN\)。物品\(i\)的重量为\(w_i\),价值为\(v_i\)。给出每个物品依赖于哪个物品。我们用\(d_i=j\(i>j>0)\)表示:如果要选取物品\(i\),就必须先选取物品\(j\)。另外,我们用\(d_i=0(i>0)\)表示:该物品不依赖于任何物品。......
  • Linux网络:TCP & UDP socket
    Linux网络:TCP&UDPsocketsocket套接字sockaddr网络字节序IP地址转换bzeroUDPsocketsocketbindrecvfromsendtoTCPsocketsocketbindlistenconnectacceptsendrecv本博客讲解Linux下的TCP和UDP套接字编程。无论是创建套接字、绑定地址,还是发送和接收数据,......
  • 如何使用 Bittly 实现 UDP 请求自动响应与处理
    在开发基于UDP的应用时,如果通信目标未就绪或者临时不可用时,可以使用Bittly的模拟服务虚拟一个支持UDP通讯的通讯终端。本文将介绍如何使用Bittly工具,实现对UDP请求的自动响应、动态数据处理、数据分帧以及数据转发。我们将从服务的准备工作开始,逐步讲解每一个步骤,帮......
  • [1050] Website endpoints in AWS
    ref:WebsiteendpointsWebsiteendpointexamplesThefollowingexamplesshowhowyoucanaccessanAmazonS3bucketthatisconfiguredasastaticwebsite.Example—RequestinganobjectattherootlevelTorequestaspecificobjectthatisstored......
  • dp做题记录
    树形dpP3177[HAOI2015]树上染色初看此题时,dp状态很明显是两维,但是合并子树时答案难于统计,然后……就不会了qwq。既然不通,考虑改变dp数组的含义,记\(dp_{i,j}\)表示当前\(i\)的子树中将\(j\)个点染黑对总答案的贡献。但是这样直接计算两点距离就变得更难了,考虑两......