沒有上司的舞會(樹形dp入門題)

2021-10-08 10:25:53 字數 3529 閱讀 8526

洛谷 p1352沒有上司的舞會

題目描述

*某大學有 n 個職員,編號為 1…n。

他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數 r[i

]r[ i ]

r[i]

,但是呢,如果某個職員的直接上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。

輸入格式
輸入的第一行是乙個整數 nnn。

第 2 到第 (n+

1)

(n + 1)

(n+1

) 行,每行乙個整數,第(i+

1)

(i + 1)

(i+1

) 行的整數表示 ii 號職員的快樂指數r[i

]r[ i ]

r[i]

。第 (n+

2)

(n + 2)

(n+2

)到第(2n

+1

)(2n+1)

(2n+1)

行,每行輸入一對整數 l,k

l, k

l,k,代表 k

kk 是 l

ll 的直接上司。

輸出格式
輸出一行乙個整數代表最大的快樂指數。

樣例輸入
711

1111

1132

3647

4453

5

樣例輸出
5
說明/提示

資料規模與約定

對於 100% 的資料,保證

1 ≤n

≤6∗10

³1 ≤ n ≤ 6*10³

1≤n≤6∗

10³,

128≤r[

i]

≤127

-128 ≤ r[ i ] ≤ 127

−128≤r

[i]≤

127,

1 ≤l

,k≤n

1 ≤ l,k ≤ n

1≤l,k≤

n。且給出的關係一定是一棵樹。

一道入門級別的樹形dp。

在攻克題目之前,我們先來分析一下樹形dp的運作方式。

樹形dp為了保證取點最優,必須從葉節點不斷推向根節點(廢話 ),求得最右值。眾所周知,根節點是沒有爸爸(上司)的,我們可以親切地稱呼他為孤兒(手動滑稽^ _ ^)

然後開始分析樣例:(注:圖1為編號關係,圖2為快樂值)

是不是發現只有5沒有直屬上司(孤兒 )?這個(孤兒 ) 就是可愛的根節點,那我們該怎麼尋找呢?

別急啊,我們先建樹。

建樹的方法主要有兩種:

1.stl vec

to

rvector

vector

首先,我們通過vec

to

rvector

vector

來定義son

[6005

]son[6005]

son[60

05],即vec

to

r

t>so

nvectorson

vector

t>so

n用son[

i]

son[i]

son[i]

來儲存i

ii結點的所有兒子,建樹。

定義root,運用root尋找根節點:

for

(register

int i =

1; i < n; i++

)int root =0;

for(

register

int i =

1; i <= n; i++

)}

定義二維陣列f

[6005][

2]

f[6005][2]

f[6005

][2]

,以f[i]

[0

]f[i][0]

f[i][0

]定義上司去,下屬不去

以f [i

][1]

f[i][1]

f[i][1

]定義上司不去,下屬去

則得出動態轉移方程:(y是x的兒子)

上司去,下屬不去:f[x

][0]

+=ma

x(f[

y][0

],f[

y][1

])

f[x][0] += max(f[y][0],f[y][1])

f[x][0

]+=m

ax(f

[y][

0],f

[y][

1])上司不去,下屬去:f[x

][1]

+=f[

y][0

]f[x][1] += f[y][0]

f[x][1

]+=f

[y][

0]

f[x][0

]+= max (f[y][1

], f[y][0

]);//上司不去,下屬去或不去

f[x][1

]+= f[y][0

];// 上司去,下屬不去

分析結束上**:

a cc

ode:

ac code:

accode

:

#include

#define max 6005

using

namespace std;

int n, r[max]

, v[max]

, f[max][2

];vector<

int>son[max]

;//stl

inline

void dp (

int x)

return;}

intmain()

int root =0;

for(

register

int i =

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

dp (root)

;//dp

return

!printf (

"%d"

, max (f[root][1

], f[root][0

]));

//省了一行

}

拜拜

沒有上司的舞會 樹形dp入門

某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請...

樹形dp 沒有上司的舞會 模板題 樹形dp

樹形dp思維門檻高,但是跨過門檻之後,思維難度卻不高。這點非常類似於 關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。285.沒有上司的舞會 簡單模擬樣例,便於理解 樣例的高興度都是 1,那就是挑選沒有相鄰邊的盡量多的點 樹形dp思路 重點 狀壓dp 思路 狀態轉...

樹形dp 沒有上司的舞會

題意 給定一棵樹,每個點有權值,對於每乙個點,它和它的父節點不能同時被選,求權值最大值。定義d p x 0 dp x 0 表示不選擇x號點時的最大值,dp x 1 d p x 1 表示選擇 x x 號點時的最大值。對於x role presentation style position relati...