acwing 285. 沒有上司的舞會
ural大學有n名職員,編號為1~n。
他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。
每個職員有乙個快樂指數,用整數 hi 給出,其中 1≤i≤n。
現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。
在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。
輸入格式
第一行乙個整數n。
接下來n行,第 i 行表示 i 號職員的快樂指數hi。
接下來n-1行,每行輸入一對整數l, k,表示k是l的直接上司。
輸出格式
輸出最大的快樂指數。
資料範圍
1≤n≤6000,
−128≤hi≤127
輸入樣例:
711
1111
1132
3647
4453
5
輸出樣例:
5
樹形dp在我印象裡,應該要用遞迴實現,因為子節點需要遍歷。
所以用遞迴實現dp,我們還是閆氏分析,找狀態表示和狀態計算。
狀態表示
d p[
i][j
]dp[i][j]
dp[i][
j],j
jj為1的時候表示以i為根節點,選i。 j
jj不為1的時候表示以i為根節點,不選i
然後求的是最大值。
狀態計算
d p[
i][0
]=∑m
ax(d
p[j]
[1],
dp[j
][0]
)j是i
的子節點
dp[i][0]=∑max(dp[j][1],dp[j][0]) j 是 i 的子節點
dp[i][
0]=∑
max(
dp[j
][1]
,dp[
j][0
])j是
i的子節點dp
[i][
1]=w
[i]+
∑dp[
j][0
]j是i
的子節點
dp[i][1]=w[i]+∑dp[j][0] j是i的子節點
dp[i][
1]=w
[i]+
∑dp[
j][0
]j是i
的子節點
**如下
#include
#include
#include
using
namespace std;
const
int n=
6010
;int ne[n]
,h[n]
,e[n]
,idx;
int w[n]
;int dp[n]
[n];
bool get_father[n]
;void
add(
int a,
int b)
void
dfs(
int x)
return;}
intmain
(void
)int root=1;
while
(get_father[root]
) root++
;dfs
(root)
;int res=
max(dp[root][0
],dp[root][1
]); cout<}
ACWing 285 沒有上司的舞會
給定一棵樹,節點編號1 n 1 sim n 1 n,每個節點有個權值,要求選出若干個點,使得沒有兩個點之間有邊,並且總權值和最大。問這個最大權值和。輸入格式 第一行乙個整數n nn。接下來n nn行,第i ii行表示第i ii個節點的權值。再接下來n 1 n 1n 1行,每行輸入一對整數l,k l,...
Acwing 285 沒有上司的舞會
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 h i hi 給出,其中 1 i n 1 i n 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,...
Acwing 0x50 動態規劃 沒有上司的舞會
題意 ural大學有n名職員,編號為 他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。...