已知樹上共有 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 要...