#119-[樹形DP]週年慶宴Hdu 1520
阿新 • • 發佈:2018-11-09
Description
Ural大學有N個職員,編號為1~N。他們有從屬關係,也就是說他們
的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職
員有一個快樂指數。現在有個週年慶宴會,要求與會職員的快樂指數之和
最大。但是,沒有職員願和直接上司一起與會。
Input
第一行一個整數N。(1<=N<=6000)
接下來N行,第i+1行表示i號職員的快樂指數Ri。(-128<=Ri<=127)
接下來N-1行,每行輸入一對整數L,K。表示K是L的直接上司。
最後一行0 0表示結束。
Output
輸出最大的快樂指數和。
Sample Input
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5
Sample Output
5
大概是一道模板
#include <iostream> #include <cstring> #include <vector> #define SIZE 10010 using namespace std; vector<int> graph[SIZE]; int dp[SIZE][2], a[SIZE]; bool visited[SIZE]; void dfs(int u) { int i, v; dp[u][0] = 0; // 對於每個節點,先初始化 dp[u][1] = a[u]; visited[u] = true; for (i = 0; i < graph[u].size(); ++i) { v = graph[u][i]; if (!visited[v]) { dfs(v); dp[u][0] += max(dp[v][0], dp[v][1]); // 條件轉移方程 dp[u][1] += dp[v][0]; } } return; } int main(void) { int n, u, v, i, index; scanf("%d", &n); for (i = 1; i <= n; ++i) { scanf("%d", &a[i]); } for (i = 1; i < n; ++i) { scanf("%d%d", &u, &v); visited[u] = true; graph[v].push_back(u); } for (index = 1; visited[index]; ++index) // 找到根節點 { } memset(visited, false, sizeof (visited)); dfs(index); printf("%d", max(dp[index][0], dp[index][1])); return 0; }