蓝桥杯生命之树(DP)

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

思路:

无向无环图的存储,且节点编号从1 开始(遍历注意一下)。本题是求这颗树中相互连接的节点的和最大问题,也就是连通块和最大问题,用dfs遍历图,dpx表示以节点x为跟的部分的和,如果dpv\[xi]小于0,那么不会增大dpx的值,所以舍去,如果dp\[xi]>0,则dpx+=dp\[xi],最后在比较各部分的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;
 } 
相关推荐
兰令水13 小时前
leecodecode【面试150】【2026.7.9打卡-java版本】
java·数据结构·leetcode·面试·职场和发展
程序员小远15 小时前
接口测试之文件上传
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
Frostnova丶21 小时前
(13)LeetCode 53. 最大子数组和
算法·leetcode·职场和发展
tkevinjd1 天前
力扣437路径总和III
算法·leetcode·面试·职场和发展
Frostnova丶2 天前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展
旧曲重听12 天前
为什么现在 RAG 越少越少提及了
数据库·程序人生·职场和发展·agent
凯瑟琳.奥古斯特2 天前
力扣1013三等分解法与C++实现
开发语言·c++·算法·leetcode·职场和发展
变量未定义~2 天前
单调栈、单调队列(模板)、子矩阵(模板)
数据结构·算法·蓝桥杯
凯瑟琳.奥古斯特2 天前
力扣1012数位DP解法详解
开发语言·c++·算法·leetcode·职场和发展
June bug2 天前
【199管理类联考】写作(第一轮复习)
考研·职场和发展·学习方法