問題描述
有一棵 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的正整數。
:dp動態規劃好像挺強大的,各種演算法好像也挺好玩的,但是實力太差,看別人的**都要一點一點看分析才能看懂,
什麼時候自己才能成為大牛呢(遐想中)
#include#include#include
#include
using
namespace
std;
vector
e[100010
];//
vector是一種順序容器,事實上和陣列差不多,但它比陣列更優越。我個人把它理解為陣列佇列
//vector可以用下標訪問
/*構造一棵樹出來,遍歷,一開始我用的是鏈式前向星儲存數,
但好像是單向的,沒做出來
*/int pow[100010];//
儲存每個節點的權值
int vis[100010];//
記錄每個節點是否走過,走過置1,沒走為0
int dp[100010][2];//
每個可以選擇的點有兩種選擇
//d[i][0]是不選第i個點
//d[i][1]是選擇第i個點
void dfs(int
f) }
}int
main()
for(int i=0;i1;i++)
vis[
1]=1
;
//從第乙個點開始遞迴
dfs(1
);
//遞迴遍歷完後,最優解在dp[1][1],dp[1][0]中得出
printf("
%d",max(dp[1][1],dp[1][0
]));
return0;
}
樹形動態規劃練習《藍橋杯 結點選擇》
問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...
結點選擇(樹形動態規劃)
現在對於樹形動態規劃理解的還不是很透徹,只能先做幾個題目練習一下 本題很重要的兩個方面乙個是建樹,這個需要邊和點的相互配合,乙個點兩條邊的表示都要標記。第二個很重要的方面是動態規劃的變化,本題首先想到的一成一成的樹,要不是子集的結合,要不就是自己本身,上乙個點要不是自己本身,要不是自己和子節點的子節...
動態規劃 樹形動態規劃 結點選擇
題目 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。輸出乙個整數,...