蓝桥杯生命之树(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;
 } 
相关推荐
dayuOK63072 天前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
枫子有风2 天前
LLM-Agent智能体(大厂面试常问)
面试·职场和发展·llm·agent
重生之后端学习2 天前
Java入门
java·开发语言·职场和发展
AIHR数智引擎2 天前
KPI物理失效:AI原生组织的效能重构与技能度量
人工智能·经验分享·职场和发展·重构·ai-native·aihr
想吃火锅10052 天前
【leetcode】121.买卖股票的最佳时机js/c++
算法·leetcode·职场和发展
程序员小远2 天前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
嘿黑嘿呦2 天前
chap 8排序
算法·蓝桥杯·排序算法·软件工程
小欣加油2 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
旧曲重听12 天前
2026前端技术从「夯」到「拉」
前端·程序人生·职场和发展·软件工程
javaDocker2 天前
某大厂AI应用开发面试题
面试·职场和发展