題目裡明確告訴了你上司與下屬的關係是一顆樹,所以這一題是很明顯的樹形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,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算...