蓝桥 生命之树

在X森林里,上帝创建了生命之树。


他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。
上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, ..., vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。


在这个前提下,上帝要使得S中的点所对应的整数的和尽量大。
这个最大的和就是上帝给生命之树的评分。


经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他需要你为他写一个程序来计算一棵树的分数。


「输入格式」
第一行一个整数 n 表示这棵树有 n 个节点。
第二行 n 个整数,依次表示每个节点的评分。
接下来 n-1 行,每行 2 个整数 u, v,表示存在一条 u 到 v 的边。由于这是一棵树,所以是不存在环的。


「输出格式」
输出一行一个数,表示上帝给这棵树的分数。


「样例输入」
5
1 -2 -3 4 5
4 2
3 1
1 2
2 5


「样例输出」
8


「数据范围」
对于 30% 的数据,n <= 10
对于 100% 的数据,0 < n <= 10^5, 每个节点的评分的绝对值不超过 10^6 。


资源约定:
峰值内存消耗 < 256M
CPU消耗  < 3000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。


注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。


提交时,注意选择所期望的编译器类型。

思路参考:点击打开链接

题目大意:
给定一颗无根树,求出一个字数,所有节点的权值之和最大。求出最大的数是多少。
题目思路:
对于每个结点的决策有2种,分别是选择和不选择,那么我们定义dp[ i ][ 0 ] 和 dp[ i ][ 1 ]分别表示不选择(选择) i 结点能得到的最大权值和。
状态转移方程是:dp [ i ] [ 1 ] = sum(max(dp[ j ][ 1 ] , dp[ j ][ 0 ])); j 是 i 的孩子结点 。
dp[ i ][ 0 ] = 0;
由于题目中给出的是无根树,所以在进行DFS的时候要进行标记,当要搜索的结点的孩子结点都曾经被访问过,那么他就是叶节点。也是就递归的边界(停止该分支的搜索)。

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n,p,q,ans=-1;
int a[100010];
int dp[100010][2];
vector<int> v[100010];
bool vis[100010];
void dfs(int x) {
	dp[x][1]=a[x];
	dp[x][0]=0;
	vis[x]=true;
	for (int i=0;i<v[x].size();i++) {
		if (!vis[v[x][i]]) {
			dfs(v[x][i]);
			dp[x][1]+=max(dp[v[x][i]][1],dp[v[x][i]][0]);
		}
		else {
			dp[x][1]=max(dp[x][1],a[x]);
			dp[x][0]=max(dp[x][0],0);
		}
	}
	return;
}
int main()
{
	scanf ("%d",&n);
	for (int i=1;i<=n;i++) scanf ("%d",&a[i]);
	for (int i=1;i<n;i++) {
		scanf ("%d%d",&p,&q);
		v[p].push_back(q);
		v[q].push_back(p);
	}
	dfs(1);
	for (int i=1;i<=n;i++) {
		ans=max(ans,dp[i][0]);
		ans=max(ans,dp[i][1]);
	}
	printf ("%d\n",ans);
	return 0;
} 



### 蓝桥嵌入式系统的时钟配置方法 在蓝桥杯嵌入式开发中,尤其是基于STM32系列微控制器的项目,时钟的配置是一个非常重要的环节。它直接影响到整个系统的性能和稳定性。以下是关于如何配置STM32G431芯片中的时钟的相关说明。 #### 1. STM32G431 的时钟源概述 STM32G431 使用了一个复杂的时钟结构来支持多种外设操作频率的需求。主要的时钟源包括内部高速振荡器 (HSI) 和外部晶振 (HSE)[^1]。这些时钟可以通过 PLL(锁相环)进一步倍频或分频,从而提供灵活的系统时钟设置。 #### 2. HAL 库下的时钟初始化函数 通过 HAL 库可以简化时钟的配置过程。通常情况下,开发者只需要调用 `HAL_RCC_OscConfig` 函数以及 `HAL_RCC_ClockConfig` 函数即可完成基本的时钟配置工作。 下面是一段典型的时钟初始化代码: ```c void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the CPU, AHB and APB buses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8; // 设置PLL倍频因子为8 RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2; // 设置PLL分频因子为2 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** 初始化CPU、AHB和APB总线时钟 */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } } ``` 上述代码实现了以下功能: - 启用了 HSI 并将其作为 PLL 输入。 - 将 PLL 倍频至指定值并分配给系统时钟。 - 配置了各个总线的分频系数以满足不同外设的速度需求。 #### 3. 关键参数解释 - **Oscillator Type**: 定义使用的振荡器类型,可以选择 HSI 或者 HSE。 - **PLLMUL & PLLDIV**: 这两个参数决定了最终输出的 PLL 时钟频率。例如,在上面的例子中,PLL 输出频率等于 `(HSI * 8 / 2)` MHz。 - **SYSCLK Source**: 系统时钟来源可选为 MSI、HSI、HSE 或 PLL。 - **Flash Latency**: 根据 SYSCLK 的速度调整 Flash 存取延迟时间,确保数据读写稳定可靠。 #### 4. 注意事项 当修改时钟配置时需注意以下几点: - 修改任何与时钟有关的部分之前应先关闭相关模块电源供应以免造成硬件损坏; - 如果更改了主系统时钟,则可能还需要重新计算 Systick 计数器或其他依赖固定周期运行的功能单元初值; - 对于低功耗模式下工作的设备来说,合理规划各部分的工作状态有助于延长电池寿命。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值