SSL1607 沒有上司的晚會 樹形DP

2021-10-01 10:22:34 字數 1604 閱讀 1578

ural大學有n個職員,編號為1~n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。

第一行乙個整數n。(1<=n<=6000)

接下來n行,第i+1行表示i號職員的快樂指數ri。(-128<=ri<=127)

接下來n-1行,每行輸入一對整數l,k。表示k是l的直接上司。

最後一行輸入0,0。

輸出最大的快樂指數。

711

1111

1132

3647

4453500

5
第一眼看過去感覺可以用搜尋乙個乙個過一遍上司,再比較大小。~but很遺憾不行,t太多了,監介。

看了一下課件,發現竟然是個樹形dp,慎思極恐!既然是樹形dp那總得吧樹畫出來吧。樣例的樹如下圖:

由題意可知:當這個點取的時候,他的所有兒子都不能取。不取的時候就無所謂,只需選擇一種價值最大的情況。

動態轉移方程(偽**):

還要建立乙個鄰接表,利用鏈式儲存結構。對於每乙個頂點,開一條鏈,依次儲存以該點為起點的邊。大概長這樣:

從根節點開始邊遞迴邊dp。

此**upd

ateupdate

update

o

n2020/8

/13on 2020/8/13

on2020

/8/1

3.之前的lj**改掉了。

#include

#include

#include

#include

using

namespace std;

int n,a[

10001

],h[

10001

],f[

10001][

2],v[10001

],tot,m;

struct node

e[10001];

void

add(

int x,

int y)

;//鄰接表一句頂四句

h[x]

=tot;

}voiddp(

int k)

}int

main()

int x,y;

for(

int i=

1;i<=n;i++

)for

(int i=

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

dp(m)

;//從根節點開始dp

cout<<

max(f[m][1

],f[m][0

]);return0;

}

SSL 1607 沒有上司的晚會

ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。第一行乙個整數n。1 n 6000 接下來n行,第i 1行表示i號職...

SSL 1607 沒有上司的晚會

ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。第一行乙個整數n。1 n 6000 接下來n行,第i 1行表示i號職...

SSL1607 沒有上司的舞會

ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。第一行乙個整數n。1 n 6000 接下來n行,第i 1行表示i號職...