樹形DP P1352 沒有上司的舞會

2021-08-28 17:48:43 字數 958 閱讀 4821

題目裡明確告訴了你上司與下屬的關係是一顆樹,所以這一題是很明顯的樹形dp,而因為下屬和直接上司不能同時參加,所以問題轉換成一棵樹上相鄰的節點不能同時取,求所取點和的最大值。

那麼我們可以自上而下地思考,對於乙個節點,自身有取或不取兩種情況,對應這兩種情況的子樹情況也不一樣,可以分類討論:

如果這個節點自身取,則他的直接兒子都不能取如果這個節點自身不取,則他的兒子可以取,也可以不取(我一開始接觸的時候總是寫成一定要取)

那麼我們如果用

當然,有根樹還要先找到根,然後進行dfs

#include #define max 6005

using namespace std;

int n, a[max], f[max][2];

vectort[max];

int dfs(int x, int op)

if(t[x].size() == 0)

else

}int s1 = a[x], s2 = 0;

for (int i = 0; i < t[x].size(); ++i)

for (int i = 0; i < t[x].size(); ++i)

f[x][0] = s2;

f[x][1] = s1;

return f[x][op];

}int main()

int l , k, root, vis[max] = ;

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

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

}int ans = max(dfs(root, 1), dfs(root, 0));

cout << ans << endl;

return 0;

}

dp 樹形dp P1352 沒有上司的舞會

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

LuoguP1352 FJSC 沒有上司的舞會

現在你有一棵樹,每乙個點有乙個點權 r i 如果選擇了 i 點,那麼 i 子樹上的所有的點都不能選,現在要求選擇若干個點,使得點權和最大。設 dp i 1 為選擇 i 點的 i 子樹的最大點權和,dp i 0 為不選擇 i 點的 i 子樹的最大點權和,那麼我們知道初始化為 dp i 0 sum ma...

樹形DP 洛谷1352 沒有上司的舞會

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