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
11 3
2 36 4
7 44 5
3 50 0
5
開門見山,這題用dp做,狀態為dp[x][0]和dp[x][1],dp[x][0]表示x不來時,他及其子樹的最大快樂指數,dp[x][1]則表示x要來時,他及其子樹的最大快樂指數。
顯然,我們需要先確定位於葉節點的狀態再來確定父節點的狀態,因此dp過程建立在dfs的基礎上。
狀態轉移方程:(v為x的子節點)
dp[x][1]+=dp[v][0] x與v不能同時到場
dp[x][0]+=max(dp[v][1],dp[v][0]) x不在,v可到可不到。
由於是求總的快樂指數,所以用加法。
#include
int max(int x,int y)
int scan()
while(c>='0'&&c<='9')
x=(x<<1)+(x<<3)+c-'0',
c=getchar();
return x*f; //讀入優化
}struct node;
node edge[7000];
int edge_num,n,fa[7000],root,pre[7000],dp[7000][2];
void add(int x,int y)
void tree_dp(int x)
}}int main()
x=scan(),y=scan();
root=1;
while(fa[root])
root=fa[root];
tree_dp(root);
printf("%d",max(dp[root][1],dp[root][0]));
}
樹形DP 經典例題 沒有上司的舞會
一般樹形dp題目中都是其中某種狀況如果想要發生必須先完成先決條件 如 這道舞會題,要保證職員去參加舞會的話,必須滿足他的直接上司不去 還有的占領城堡的題,要占領乙個城堡必須先占領另乙個城堡。看到這樣的情況就考慮一下樹形dp 題目描述 ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們...
樹形dp 沒有上司的舞會
題意 給定一棵樹,每個點有權值,對於每乙個點,它和它的父節點不能同時被選,求權值最大值。定義d p x 0 dp x 0 表示不選擇x號點時的最大值,dp x 1 d p x 1 表示選擇 x x 號點時的最大值。對於x role presentation style position relati...
樹形DP 沒有上司的舞會
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快...