在大家的三連助攻下,tt 一舉獲得了超級多的貓咪,因此決定開一間貓咖,將快樂與大家一同分享。並且在開業的那一天,為了紀念這個日子,tt 在貓咖門口種了一棵蘋果樹。
一年後,蘋果熟了,到了該摘蘋果的日子了。
已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w[i] 的蘋果,為了可持續發展,tt 要求摘了某個蘋果後,不能摘它父節點處的蘋果。
tt 想要令快樂值總和盡可能地大,你們能幫幫他嗎?
input
結點按 1~n 編號。output第一行為 n (1 ≤ n ≤ 6000) ,代表結點個數。
接下來 n 行分別代表每個結點上蘋果的快樂值 w[i](-128 ≤ w[i] ≤ 127)。
接下來 n-1 行,每行兩個數 l k,代表 k 是 l 的乙個父節點。
輸入有多組,以 0 0 結束。
每組資料輸出乙個整數,代表所選蘋果快樂值總和的最大值。輸入樣例
711
1111
1137
4234
5643
500
輸出樣例
5
用類似鏈式前向星儲存樹結構,然後找出根節點root
定義 f[i][0/1] 表示以 i 為節點的子樹所能得到的最大的快樂值。
f[i][0] 表示以 i 為子樹且未選擇 i 號節點;
f[i][1] 表示以 i 為子樹且選擇了 i 號節點
進行dfs遍歷所有孩子節點,更新:
f[i][0] += max(f[x][0], f[x][1]);
f[i][1] += f[x][0];
最終答案就是 max(f[root][0], f[root][1])
#include
#include
#include
using
namespace std;
int n;
int w[
6010
], f[
6010][
2];vector<
int> v[
6010];
bool noroot[
6010];
void
dfs(
int root)
}int
main()
while(1
)int root;
for(
int i=
1; i<=n; i++)}
dfs(root);
cout<<
max(f[root][0
],f[root][1
])<}
Week13作業 D TT的蘋果樹 樹型dp
已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w i 的蘋果,為了可持續發展,tt 要求摘了某個蘋果後,不能摘它父節點處的蘋果。tt 想要令快樂值總和盡可能地大,你們能幫幫他嗎?結點按 1 n 編號。第一行為 n 1 n 6000 代表結點個數。接下來 n 行分別代表每個結點上蘋果的快樂值 w...
樹形dp TT的蘋果樹
在大家的三連助攻下,tt 一舉獲得了超級多的貓咪,因此決定開一間貓咖,將快樂與大家一同分享。並且在開業的那一天,為了紀念這個日子,tt 在貓咖門口種了一棵蘋果樹。一年後,蘋果熟了,到了該摘蘋果的日子了。已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w i 的蘋果,為了可持續發展,tt 要求摘了...
做一棵永遠成長的蘋果樹
做一棵永遠成長的蘋果樹 一棵蘋果樹,終於結果了。第一年,它結了10個蘋果,9個被拿走,自己得到1個。對此,蘋果樹憤憤不平,於是自斷經脈,拒絕成長。第二年,它結了5個蘋果,4個被拿走,自己得到1個。哈哈,去年我得到了10 今年得到20 翻了一番。這棵蘋果樹心理平衡了。但是,它還可以這樣 繼續成長。譬如...