題目傳送門
某大學有 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的兒子為根的最大值之和,再加上...