首页 > 其他分享 >最大子树和

最大子树和

时间:2024-11-14 16:07:39浏览次数:1  
标签:修剪 子树 最大 int 朵花 美丽 adj

题目链接:最大子树和

题目描述:

小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:
一株奇怪的花卉,上面共连有\(N\)朵花\(N−1\)条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个“美丽指数”,该数越大说明这朵花越漂亮,也有“美丽指数”为负数的,说明这朵花看着都让人恶心。所谓“修剪”,意为:去掉其中的一条枝条,这样一株花就成了两株,扔掉其中一株。经过一系列“修剪“之后,还剩下最后一株花(也可能是一朵)。老师的任务就是:通过一系列“修剪”(也可以什么“修剪”都不进行),使剩下的那株(那朵)花卉上所有花朵的“美丽指数”之和最大。
老师想了一会儿,给出了正解。小明见问题被轻易攻破,相当不爽,于是又拿来问你。

输入格式:

第一行:一个整数n\((1 \le N \le 16000)\).表示原始的那株花卉上共\(n\)朵花
第二行有\(n\)个整数,第\(i\)个整数表示第\(i\)朵花的美丽指数.
接下来\(n-1\)行 每一行两个整数\(a,b\),表示存在a和b的枝条

输出格式:

一个数,表示一系列“修剪”之后所能得到的“美丽指数”之和的最大值。保证绝对值不超过 \(2147483647\)

分析:

很明显的树型dp,但是这题没有明确告诉我们祖宗关系 所以我们要选定一个祖宗结点或者用,并且要建双向边.
状态表示\(f[i]\)记录以\(i\)为根的子树中,点权和最大的一颗子树
开始时,\(f[u]=a[u]\),接下来对于\(u\)的每颗子树我们都可以选择是否剪枝.
对于u的儿子v,如果\(f[v]<0\)那么就要剪掉u->v这条边().
那么状态转移方程:\(f[u]=f[u]+(f[v]>0?f[v]:0)(v为u的儿子)\)

注意:我们建的双向边,所以在遍历儿子的时候不能遍历到其父亲

#include<bits/stdc++.h>
using namespace std;
const int N  =1.7e4;
int f[N];
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>f[i];
    vector<vector<int>>adj(n+1);
    for(int i=1;i<n;i++)
    {
        int a,b;cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    vector<bool>vis(n+1,false);
    function<void(int,int)>dfs=[&](int u,int fa){
        for(auto v:adj[u])
        {   if(v!=fa)
            {   
                dfs(v,u);
                if(f[v]>0)f[u]+=f[v];
            }
        }
    };
    int res=-2147483647;
    dfs(1,0);
    for(int i=1;i<=n;i++)res=max(res,f[i]);
    cout<<res<<endl;
    return 0;
}

标签:修剪,子树,最大,int,朵花,美丽,adj
From: https://www.cnblogs.com/Shumian/p/18546240

相关文章

  • 【Azure App Service】在App Service for Windows上验证能占用的内存最大值Y5
    问题描述在创建AppService服务的时候,根据定价层不同,内存使用的最大值也有不同。但在实际测试中,发现内存最大只能占用2GB左右,而定价层中内存分配明明是大于2GB(比如B3定价层的内存为7GB),这是一种什么情况呢?在AppService中Kudu工具上,查看进程分配的内存大小:问题解答使用......
  • 【Azure App Service】在App Service for Windows上验证能占用的内存最大值
    问题描述在创建AppService服务的时候,根据定价层不同,内存使用的最大值也有不同。但在实际测试中,发现内存最大只能占用2GB左右,而定价层中内存分配明明是大于2GB(比如B3定价层的内存为7GB),这是一种什么情况呢?在AppService中Kudu工具上,查看进程分配的内存大小: 问题解答使......
  • 101 最大公约数
    //101最大公约数.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/21/problem/486输入T,一共T组数据,每组两个数a,b,输出它们的最大公约数和最小公倍数。输入格式第一行一个数字T。接下来T行,每行两个数字a,b。输出格......
  • C小题目:输入10个整数,将其中最小的数与第1个数对换,将最大的数与最后一个对换。要求写3
    题目要求如下:输入10个整数,将其中最小的数与第1个数对换,将最大的数与最后一个对换。要求写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。提示:(1)定义voidinput(int*p)函数,用来输入10个整数,存放到指针变量p所指向的数组中;(2)定义voidmax_min_value(int*p)函数,在指针变量p所指......
  • 华为OD机试真题-寻找最大价值的矿堆-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述给你一个由''(空地)......
  • 代码随想录算法训练营第十一天|LeetCode150.逆波兰表达式求值、239.滑动窗口最大值、3
    前言打卡代码随想录算法训练营第49期第十一天 φ(゜▽゜*)♪首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目在学......
  • 解决DDD最大难题-如何划分领域
    https://www.cnblogs.com/Can-daydayup/p/18528659 前言在.NET开发中,为了准确统计对应方法的执行时间,我们最常用的方式是手动使用Stopwatch来显式编写计时逻辑,但是假如你需要大量的使用Stopwatch来进行耗时统计的话不利于保持代码的整洁和增加代码的维护成本。项目介绍......
  • C++求最小公倍数与最大公因数
    #大一小卡了咪的作业4题目:        设计两个函数MaxCommonDevisor(n,m) 和MinCommonMultiple(n,m),分别求两个数的最大公约数和最小公倍数。主函数调用上述两个函数,实现功能。    乍一看这个题其实比较麻烦,因为要同时满足两个数的要求(同时整除/分别整除),但实际......
  • leetcode刷题笔记--最大滑动窗口
    classSolution{publicintlongestOnes(int[]nums,intk){intl=0,r=0;while(r<nums.length){if(nums[r++]==0){k--;}if(k<0&&nums[l++]==0){......
  • 85. 最大矩形
    题目链接解题思路暴力怎么做?我们可以枚举,矩阵的底,必须是第0行,求一个最大值,矩阵的底,必须是第1行,求一个最大值,把所有的都得到,然后最大的那个,就是结果。依次类推,所有结果的最大值,就是全局最优解举个例子,假设矩阵[ [1,0,1,0,0], [1,0,1,1,1], [1,1,1,1,......