某大學有n個職員,編號為$1~n$。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數$r_i$,但是呢,如果某個職員的直接上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。
第一行乙個整數$n$。$(1<=n<=6000)$
接下來n行,第$i+1$行表示$i$號職員的快樂指數$r_i$。$(-128<=r_i<=127)$
接下來$n-1$行,每行輸入一對整數l,k。表示k是l的直接上司。
最後一行輸入0 0
輸出最大的快樂指數。
思路:因為除了終極大boss外,每個職工都有乙個直接上司,可以把職工指向直接上司,則當前節點和他的一度的子節點是矛盾的
定義狀態:$f[x][0]$表示當前職工不去
$f[x][0]$表示當前職工一定去
狀態轉移:$f[x][0]+=max(f[use[0],max(0,f[use][1]))$當前節點的子節點去或者不去和當前節點的子節點去這兩種情況選乙個大的
$f[x][1]+=max(0,f[use][0])$當前節點去,所以子節點一定不去,更新$f[x][1]$
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;
7intn;8
int r[6005];9
intx,y;
10int
l,k;
11int f[60005][2
];12 vector q[6005
];13
int fa[60005
];14
void dp(int
x) 23
return;24
}25intmain()
33for (int i = 1; i <= n-1; i++)
38 scanf ("
%d%d
",&x,&y);
39for (int i =1; i <= n; i++)
40if(fa[i]==i)
44dp(ans);
45 cout<0], f[ans][1
]);46
return0;
47 }
樹形DP P1352 沒有上司的舞會
題目裡明確告訴了你上司與下屬的關係是一顆樹,所以這一題是很明顯的樹形dp,而因為下屬和直接上司不能同時參加,所以問題轉換成一棵樹上相鄰的節點不能同時取,求所取點和的最大值。那麼我們可以自上而下地思考,對於乙個節點,自身有取或不取兩種情況,對應這兩種情況的子樹情況也不一樣,可以分類討論 如果這個節點自...
樹形DP 洛谷1352 沒有上司的舞會
題目 某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算...
P1352 沒有上司的舞會(樹形dp)
題意 在乙個學校裡,有n個人,他們之間的關係可以描述成一顆樹,樹上的父節點是其子節點的直屬上司。現在學校要舉辦乙個聚會,每個人來參加聚會,會產生a i 的貢獻,但是如果乙個人的直系上司來參加聚會,那麼這個人無論如何都不會來參加。問你能夠產生的最大貢獻是多少?思路 我們先找到入度為0的根節點,由根節點...