Week 13 D TT的蘋果樹

2021-10-06 06:37:46 字數 1491 閱讀 6511

在大家的三連助攻下,tt 一舉獲得了超級多的貓咪,因此決定開一間貓咖,將快樂與大家一同分享。並且在開業的那一天,為了紀念這個日子,tt 在貓咖門口種了一棵蘋果樹。

一年後,蘋果熟了,到了該摘蘋果的日子了。

已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w[i] 的蘋果,為了可持續發展,tt 要求摘了某個蘋果後,不能摘它父節點處的蘋果。

tt 想要令快樂值總和盡可能地大,你們能幫幫他嗎?

input

結點按 1~n 編號。

第一行為 n (1 ≤ n ≤ 6000) ,代表結點個數。

接下來 n 行分別代表每個結點上蘋果的快樂值 w[i](-128 ≤ w[i] ≤ 127)。

接下來 n-1 行,每行兩個數 l k,代表 k 是 l 的乙個父節點。

輸入有多組,以 0 0 結束。

output

每組資料輸出乙個整數,代表所選蘋果快樂值總和的最大值。

輸入樣例

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 翻了一番。這棵蘋果樹心理平衡了。但是,它還可以這樣 繼續成長。譬如...