藍橋杯 ALGO 4 結點選擇

2021-09-10 12:43:48 字數 1028 閱讀 3174

演算法訓練 結點選擇  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?

輸入格式

第一行包含乙個整數 n 。

接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。

接下來一共 n-1 行,每行描述樹上的一條邊。

輸出格式

輸出乙個整數,代表選出的點的權值和的最大值。

樣例輸入

51 2 3 4 5

1 21 3

2 42 5

樣例輸出

樣例說明

選擇3、4、5號點,權值和為 3+4+5 = 12 。

資料規模與約定

對於20%的資料, n <= 20。

對於50%的資料, n <= 1000。

對於100%的資料, n <= 100000。

權值均為不超過1000的正整數。

分析:最開始想使用貪心,每次遍歷找出最大值並將其餘其相鄰節點去除,由此找出最大和。失敗後轉用樹狀dp,思想為:若選擇某節點,則不選擇其相鄰節點;若不選擇某節點,則可選擇也可不選其相鄰節點。dp陣列的含義橫座標為節點編號,縱座標為是否選擇此節點。

**:

#include#include#includeusing namespace std;

#define maxn 100001

struct node g[maxn];

int visit[maxn] = ;

int dp[maxn][2] = ;

void dfs(int start) }}

int main()

for (int i = 0; i < n - 1; i++)

dfs(1);

cout << max(dp[1][0], dp[1][1]) << endl;;

return 0;

}

樹形DP 藍橋杯 ALGO 4 結點選擇

問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...

藍橋杯 演算法訓練 ALGO 4 結點選擇

本人是乙個剛剛接觸c 不久的傻學生 記錄一些自己的學習過程。大神路過可以批評指正 問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,...

藍橋杯ALGO 4演算法訓練 結點選擇(樹形DP)

問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...