洛谷 P1352 沒有上司的舞會

2022-03-20 04:08:17 字數 1455 閱讀 2926

題目傳送門

某大學有 nn 個職員,編號為 1\ldots n1…n。

他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。

現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數 r_ir**i,但是呢,如果某個職員的直接上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。

所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。

輸入的第一行是乙個整數 nn。

第 22 到第 (n + 1)(n+1) 行,每行乙個整數,第 (i+1)(i+1) 行的整數表示 ii 號職員的快樂指數 r_ir**i。

第 (n + 2)(n+2) 到第 (2n + 1)(2n+1) 行,每行輸入一對整數 l, kl,k,代表 kk 是 ll 的直接上司。

輸出一行乙個整數代表最大的快樂指數。

樹形dp的基礎題,當作例題來講的。

關於我樹形dp的講解,需要的蒟蒻請走這邊:

樹形dp**

看到這個題是個多階段決策的問題,然後還有樹形結構,那麼就是樹形dp。(逃

那麼考慮狀態和轉移。

第一維肯定是以\(i\)為根的子樹。我們容易發現這個狀態肯定與當前節點有沒有選擇有關。因為選了當前節點,他的兒子們就都選不了。所以第二維就設定成選不選當前節點。

那麼我們的狀態就是:\(dp[i][0/1]\)表示以\(i\)為根的子樹不邀請/邀請\(i\)得到的最大快樂指數。

那麼狀態轉移方程就是:

\[dp[x][0]+=\max(dp[y][0],dp[y][1])\qquad(y\in son[x])

\\ \quad \\dp[x][1]+=dp[y][0]

\]方程很好想。也很容易理解。

那麼就是轉移了,用深搜從下到上統計資訊。注意要統計入度找一下根節點\(root\)的位置。然後開始搜,答案就是:\(\max(dp[root][0],dp[root][1])\)。

附ac**:

#include#includeusing namespace std;

const int maxn=6010;

int n,root,ans;

int a[maxn],fa[maxn];

int tot,to[maxn<<1],nxt[maxn<<1],head[maxn];

int dp[maxn][2];//dp[i][0/1]表示以i為根的子樹邀請/不邀請i的最大快樂指數。

void add(int x,int y)

void dfs(int x,int f)

}int main()

for(int i=1;i<=n;i++)

dfs(root,0);

ans=max(dp[root][0],dp[root][1]);

printf("%d",ans);

return 0;

}

洛谷 P1352 沒有上司的舞會

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

洛谷 P1352 沒有上司的舞會

原題 這道題我非常神奇賴皮的用了拓撲,實際上這是一道樹形dp,但是身為蒟蒻的我覺得拓撲可以寫,結果真的讓我水過了,哈哈哈 用乙個二維陣列模擬每個人參加或者不參加,從最底層的員工開始向上拓撲 by acer.mo include include includeusing namespace std i...

洛谷p1352 沒有上司的舞會

題目已經說了這是一棵樹,而這道題顯然不是重心或者lca之類的東西,所以我們考慮樹形dp。一句廢話 首先考慮如果節點i不去舞會時以i為根的子樹的快樂指數最大值,顯然就是每個以i的兒子為根的子樹的最大值之和。如果節點i參加舞會,那麼相應的最大值就是i的每個兒子都不去時,以i的兒子為根的最大值之和,再加上...