某大學有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:
7111111
11 3
2 36 4
7 44 5
3 50 0
輸出樣例#1:
5樹型dp入門題。
對於樹中的每乙個點,要麼選,要麼不選。若選的話,他的孩子節點一定不能選;不選的話,他的孩子節點可以選或不選。
所以開乙個二維陣列,其中 dp[i][0] 代表在i沒選的情況下,dp[i][1]是選了的情況下。
那麼轉移方程
dp[i][0] = sum(max(dp[j][0], dp[j][1]));
dp[i][1] = sum(dp[j][1]) + a[i];
思路是dfs。回溯的時候進行計算。
當遞迴到葉節點的時候,若沒取,返回0;否則返回a[i]。
1 #include2 #include3 #include4 #include5 #include6 #include7using
namespace
std;
8const
int maxn = 1e4 + 5;9
inta[maxn], pa[maxn], n;
10 vectorv[maxn];
11int dp[maxn][2
];12
int dfs(int now, int
flag)
1321
if(flag) dp[now][flag] +=a[now];
22return
dp[now][flag];23}
24int
main()
2533
int x = 1;34
while(pa[x]) x++; //
找根節點
35 v[0].push_back(x); //
理論上取max(dfs(1, 1),dfs(1, 0))),但事實上可以給節點加乙個父親,然後直接dfs(0, 0);
36 printf("
%d\n
", dfs(0, 0
));37
return0;
38 }
沒有上司的舞會
題目描述 description ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。輸入描述 input descri...
沒有上司的舞會
ural大學有 n 個職員,編號為 1 n 他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。第一行乙個整數n。1 n 6000 接下來n行,第i 1行表示...
沒有上司的舞會
某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請...