蓝桥杯生命之树(DP)

复制代码
 输入:5
     1 -2 -3 4 5
     4 2
     3 1
     1 2
     2 5
输出:8

思路:

无向无环图的存储,且节点编号从1 开始(遍历注意一下)。本题是求这颗树中相互连接的节点的和最大问题,也就是连通块和最大问题,用dfs遍历图,dp[x]表示以节点x为跟的部分的和,如果dp[v[x][i]]小于0,那么不会增大dp[x]的值,所以舍去,如果dp[[x][i]]>0,则dp[x]+=dp[[x][i]],最后在比较各部分的dp,找到最大值即为所求。

注意:0ll是表示长整型的0,max比较一般要同类型

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,a[N],dp[N];
vector<int> v[N];
void dfs(int x,int fa) 
{
	dp[x]=a[x];
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==fa) continue;
		dfs(v[x][i],x);
		dp[x]+=max(0ll,dp[v[x][i]]);//不能确定dp什么时候<0,因此要递归遍历
	}
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n-1;i++)
	{
		int a,b;
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	dfs(1,-1);
	int ans=-0x3f3f3f3f;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,dp[i]);
	}
	cout<<ans<<endl;
 } 
相关推荐
User_芊芊君子1 小时前
【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现
算法·leetcode·职场和发展
熬夜造bug1 小时前
LeetCode Hot100 刷题路线(Python版)
算法·leetcode·职场和发展
测试者家园6 小时前
测试用例智能生成:是效率革命,还是“垃圾进,垃圾出”的新挑战?
人工智能·职场和发展·测试用例·测试策略·质量效能·智能化测试·用例设计
win x8 小时前
JavaSE(基础)高频面试点及 知识点
java·面试·职场和发展
橘颂TA11 小时前
【剑斩OFFER】算法的暴力美学——力扣 207 题:课程表
数据结构·c++·算法·leetcode·职场和发展
谁刺我心11 小时前
【蓝桥杯刷题环境】VScode插件算法刷题Competitive Companion
职场和发展·蓝桥杯
有一个好名字11 小时前
力扣-迷宫中离入口最近的出口
算法·leetcode·职场和发展
努力学算法的蒟蒻12 小时前
day72(1.31)——leetcode面试经典150
面试·职场和发展
YuTaoShao12 小时前
【LeetCode 每日一题】744. 寻找比目标字母大的最小字母——(解法一)遍历
算法·leetcode·职场和发展
南风知我意9571 天前
【前端面试2】基础面试(杂项)
前端·面试·职场和发展