先放題面
某大學有n個職員,編號為1~n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。這是一道非常簡單的樹形動規入門題,思路也很簡單輸入格式:
第一行乙個整數n。(1<=n<=6000)
接下來n行,第i+1行表示i號職員的快樂指數ri。(-128<=ri<=127)
接下來n-1行,每行輸入一對整數l,k。表示k是l的直接上司。
最後一行輸入0 0
輸出格式:
輸出最大的快樂指數。
輸入樣例#1:71
1111
111 32 3
6 47 4
4 53 5
0 0輸出樣例#1:
5
摘取題意可知,乙個人不願意與自己的直接上司同時參加舞會,也就是相當於乙個人不能與自己直接下屬及直接上司同時參加舞會,繼續化簡就是每個點不會與和自己直接相連的點同時被選中說白了就是
那麼我們直接看**說話咯
#include#include#include#include#define gc() getchar()
#define ll long long
#define maxn 6005
using namespace std;
inline ll read()
while(isdigit(p))
return f?-a:a;
}struct ahahae[maxn*2];
int n,head[maxn],sz,a[maxn];
ll f[maxn][2]; //f[i][0]表示第i個點未被選中的最大值,f[i][1]表示第i個點被選中的最大值
inline void add(int u,int v)
void dfs(int u,int fa)
}int main() //若乙個點被選中,則至少加上它自己的「快樂指數」
for(int i=1;i<=n;++i)
dfs(1,0); //以1為根節點(這道題並沒有交代根節點,所以以1為根節點)
printf("%lld",max(f[1][0],f[1][1]));
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的兒子為根的最大值之和,再加上...