演算法題 樹形dp 沒有上司的舞會(Python)

2021-10-16 22:32:06 字數 1352 閱讀 8199

公司有n名職員,編號為1~n。

他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。

每個職員有乙個快樂指數,用整數 hihi 給出,其中 1≤i≤n。

現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。

在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。

輸入格式

第一行乙個整數n。

接下來n行,第 i 行表示 i 號職員的快樂指數hi。

接下來n-1行,每行輸入一對整數l, k,表示k是l的直接上司。

輸出格式

輸出最大的快樂指數。

資料範圍

1≤n≤6000

−128≤hi≤127

輸入樣例:

711

1111

11 3

2 36 4

7 44 5

3 5

輸出樣例:

5
import sys

sys.setrecursionlimit(1000000)

n = int(input())

h, e, ne = [-1] * (n+1), [0] * (2*n+1), [0] * (2*n+1)

idx = 0

is_root = [true] * (n+1) # 判斷是否為根節點

dp = [[0] * 2 for _ in range(n+1)]

def add(a, b):

global idx

e[idx] = b

h[a], ne[idx] = idx, h[a]

idx += 1

def dfs(x):

i = h[x]

while i != -1:

child = e[i]

dfs(child)

dp[x][1] += dp[child][0]

dp[x][0] += max(dp[child][1], dp[child][0])

i = ne[i]

for i in range(1, n+1):

for _ in range(n-1):

b, a = map(int, input().split())

add(a, b)

is_root[b] = false

for i in range(1, n+1):

if is_root[i]:

dfs(i)

print(max(dp[i][0], dp[i][1]))

break

樹形dp 沒有上司的舞會 模板題 樹形dp

樹形dp思維門檻高,但是跨過門檻之後,思維難度卻不高。這點非常類似於 關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。285.沒有上司的舞會 簡單模擬樣例,便於理解 樣例的高興度都是 1,那就是挑選沒有相鄰邊的盡量多的點 樹形dp思路 重點 狀壓dp 思路 狀態轉...

沒有上司的舞會(樹形dp入門題)

洛谷 p1352沒有上司的舞會 題目描述 某大學有 n 個職員,編號為 1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數 r i r i r i 但是呢,如果某個職員的直接上司來參加舞會了...

樹形dp 沒有上司的舞會

題意 給定一棵樹,每個點有權值,對於每乙個點,它和它的父節點不能同時被選,求權值最大值。定義d p x 0 dp x 0 表示不選擇x號點時的最大值,dp x 1 d p x 1 表示選擇 x x 號點時的最大值。對於x role presentation style position relati...