P1352 沒有上司的舞會

2022-04-06 22:21:34 字數 1275 閱讀 1341

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

輸入格式:

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

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

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

最後一行輸入0 0

輸出格式:

輸出最大的快樂指數。

輸入樣例#1:

711

1111

11 3

2 36 4

7 44 5

3 50 0

輸出樣例#1:

5拓撲排序+動規+其他(具體什麼我也說不出名字,詳見**)

具體方法就是先找到所有的入度為0的點,(最下層的點),入隊。從下面往上走,遇到入度為0的入隊,並且稍微加一點處理。

首先我們要明確,每個點都有「選」,「不選」兩種(來不來),

然後假設d表示當前到了d點,u是他的上司,f[0/1]表示當前點選或者不選時的快樂最大值

那麼從當前點到他的上司時,他的上司如果選:f[u][1]+=f[d][0];當前點就不能選,如果他的上司不選 f[u][0]=max(f[d][0],f[d][1]);他可以選也可以不選,取大。

那我們就可以在拓撲排序時把這些完成就行了。

1 #include2 #include3 #include4

using

namespace

std;56

struct

nodet[10010];9

int f[10010][2

];10

intn,ans;

11 queueq;

1213

intmain()

1425

for (int i=1; i<=n; ++i)

2630

while (!q.empty())

3142

else ans += max(f[d][1],f[d][0

]);43

}44 printf("

%d\n

",ans);

45return0;

46 }

P1352 沒有上司的舞會

原題鏈結 樹形dp入門 dp方程搞錯了居然還過了90 利用dfs遞迴求解 每個點分為選和不選兩種情況 假設選為1不選為0 dp x 0 max dp num i 1 dp num i 0 這裡一開始寫成了dp num i 1 但它的兒子的兩種狀態實際上都是可選的 dp x 1 dp num i 0 ...

P1352 沒有上司的舞會

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

P1352 沒有上司的舞會

題目 p1352 沒有上司的舞會 演算法標籤 dp,搜尋,樹形結構,記憶化搜尋 從樹的頭往下求結果會有後效性,且有多個葉子節點,資料不易處理 則採用,葉子節點往頭部求結果 對於某一節點,有選擇和不選擇兩種情況 1 不選擇的話 記 dp 0 for int i 0 i a x tail.size i ...