試題 演算法訓練 結點選擇

2021-10-14 23:05:31 字數 1168 閱讀 7787

資源限制

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

問題描述

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

輸入格式

第一行包含乙個整數 n 。

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

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

輸出格式

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

樣例輸入

51 2 3 4 5

1 21 3

2 42 5

樣例輸出

12樣例說明

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

資料規模與約定

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

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

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

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

從葉子結點往上到根結點遍歷

1、 初始化每乙個結點,對應選該結點和不選該結點兩種情況。

dp[k][0]=0,dp[k][1]=x;//x為k結點權值

2、 對於每個結點i,

3、 結果輸出的最大權值即為max(dp[1][0],dp[1][1] )

#include #include using namespace std;

int n;

int dp[100002][2];

vector> tree;//相當於二維不定長陣列

void dfs(int x,int x_f)

dfs(1,0);

cout<1、為什麼要if(x_s!=x_f) 這個判斷條件,其實就是為了不走回路,比如1,2結點相連,1的子節點有2,那麼2往下走,就不需要再遍歷1了。

2、乙個二維陣列的二維的長度不確定,可以使用vector> tree;

即定義乙個不定長陣列tree的型別為不定長陣列。設定大小用resize()函式。

試題 演算法訓練 結點選擇

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

演算法訓練 結點選擇

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

演算法訓練 結點選擇

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