Week13作業 D TT的蘋果樹 樹型dp

2021-10-06 06:48:05 字數 1320 閱讀 1118

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

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

結點按 1~n 編號。

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

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

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

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

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

儲存樹可以使用節點-孩子的結構,int w為節點,vector child為孩子。

令f[i][j]是以i為根的子樹的最大快樂值,j=0為不選擇i節點,j=1為選擇i節點。則f[i][0]=孩子節點∑max(f[x][0],f[x][1]),f[i][1]=孩子節點∑f[x][0]+tree[i].w。

根據輸入找出樹根,然後從樹根開始遞迴求解,答案就是max(f[root][0],f[root][1])。

一道樹型dp題目,很好的體現了樹型dp的遞迴特點。

#include

#include

using

namespace std;

const

int maxn=

6005

;//樹

struct point

tree[maxn]

;bool root[maxn]

;//dp

int f[maxn][2

];voiddp(

int i)

}int ans;

intmain()

for(

int i=

1;i<=n;i++

) cin>>tree[i]

.w;for

(int i=

1;i<=n;i++

) root[i]=1

,tree[i]

.child.

clear()

;for

(int i=

1;i<=n-

1;i++

)int rt;

//樹根

for(

int i=

1;i<=n;i++)if

(root[i]

) rt=i;

dp(rt)

; ans=

max(f[rt][0

],f[rt][1

]); cout<}}

Week 13 D TT的蘋果樹

在大家的三連助攻下,tt 一舉獲得了超級多的貓咪,因此決定開一間貓咖,將快樂與大家一同分享。並且在開業的那一天,為了紀念這個日子,tt 在貓咖門口種了一棵蘋果樹。一年後,蘋果熟了,到了該摘蘋果的日子了。已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w i 的蘋果,為了可持續發展,tt 要求摘了...

Week13 作業 必做

a tt 的神秘任務1 這一天,tt 遇到了乙個神秘人。神秘人給了兩個數字,分別表示 n 和 k,並要求 tt 給出 k 個奇偶性相同的正整數,使得其和等於 n。例如 n 10,k 3,答案可以為 4 2 4 tt 覺得這個任務太簡單了,不願意做,你能幫他完成嗎?本題是spj input 第一行乙個...

Week13作業 選做題D

題意 在大家的三連助攻下,tt 一舉獲得了超級多的貓咪,因此決定開一間貓咖,將快樂與大家一同分享。並且在開業的那一天,為了紀念這個日子,tt 在貓咖門口種了一棵蘋果樹。一年後,蘋果熟了,到了該摘蘋果的日子了。已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w i 的蘋果,為了可持續發展,tt 要...