某大學有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:
7111111
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 #include4using
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 ...