洛谷傳送門
某大學有n
nn個職員,編號為1∼n
1\sim n
1∼n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數r
ir_i
ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。
輸入格式:
第一行乙個整數n。(1≤n
≤6000
1\le n\le 6000
1≤n≤60
00)接下來n
nn行,第i+1
i+1i+
1行表示i號職員的快樂指數r
ir_i
ri。(−
128≤ri
≤127
-128\le ri\le 127
−128≤r
i≤12
7)接下來n−1
n-1n−
1行,每行輸入一對整數l,k
l,kl,
k。表示k
kk是l
ll的直接上司。
最後一行輸入0
00\ 0
00輸出格式:
輸出最大的快樂指數。
輸入樣例#1:
711
1111
11 3
2 36 4
7 44 5
3 50 0
輸出樣例#1:5
樹上0/1
dp
0/1dp
0/1d
p。 設dp[
i][0
]dp[i][0]
dp[i][
0]表示不選這個點, dp[
i][1
]dp[i][1]
dp[i][
1]表示選這個點, 那麼轉移方程為:
d p[
i][0
]=∑j
,j∈s
on[i
]max
(dp[
j][0
],dp
[j][
1])d
p[i]
[1]=
∑j,j
∈son
[i]d
p[j]
[0]+
val[
i]
dp[i][0]=\sum_max(dp[j][0],dp[j][1]) \\ dp[i][1]=\sum_dp[j][0]+val[i]
dp[i][
0]=j
,j∈s
on[i
]∑m
ax(d
p[j]
[0],
dp[j
][1]
)dp[
i][1
]=j,
j∈so
n[i]
∑dp
[j][
0]+v
al[i
]**如下:
#include
#include
#include
#include
#include
#include
#define r register
#define in inline
#define w while
#define gc getchar()
#define mx 10500
bool neg;
template
<
class
t>
in void
in(t &x)
int dot, cnt;
int dp[mx][2
], head[mx]
, val[mx]
, deg[mx]
;struct edge edge[mx <<1]
;in void
add(r int from, r int to)
, head[from]
= cnt;
}void
dfs(r int now)
}int
main
(void
)}
Luogu P1352 沒有上司的舞會
某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請...
LuoguP1352 FJSC 沒有上司的舞會
現在你有一棵樹,每乙個點有乙個點權 r i 如果選擇了 i 點,那麼 i 子樹上的所有的點都不能選,現在要求選擇若干個點,使得點權和最大。設 dp i 1 為選擇 i 點的 i 子樹的最大點權和,dp i 0 為不選擇 i 點的 i 子樹的最大點權和,那麼我們知道初始化為 dp i 0 sum ma...
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 ...