資源限制
時間限制: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 行,每行描述樹上的一條邊。...