首页 > 代码库 > HDU 1520Anniversary party(树型DP)
HDU 1520Anniversary party(树型DP)
HDU 1520 Anniversary party
题目是说有N个人参加party,每个人有一个rating值(可以理解为权值)和一个up(上司的编号),为了保证party的趣味性,每一个人不可以和他的直接上司都参加,问最后的rating和最大
这是一个典型的树形DP,DP[i][0]表示i不参加那他的这棵子树上的最大权值,DP[i][1]表示i参加时的这棵树上的最大权值,那么:
DP[i][0] = sum{MAX(DP[j][1], DP[j][0]) | j是i的直接子节点}
DP[i][1] = sum{DP[j][0] | j是i的直接子节点}
1 //#pragma comment(linker,"/STACK:102400000,102400000") 2 #include <map> 3 #include <set> 4 #include <stack> 5 #include <queue> 6 #include <cmath> 7 #include <ctime> 8 #include <vector> 9 #include <cstdio>10 #include <cctype>11 #include <cstring>12 #include <cstdlib>13 #include <iostream>14 #include <algorithm>15 using namespace std;16 #define INF 1e917 #define inf (-((LL)1<<40))18 #define lson k<<1, L, mid19 #define rson k<<1|1, mid+1, R20 #define mem0(a) memset(a,0,sizeof(a))21 #define mem1(a) memset(a,-1,sizeof(a))22 #define mem(a, b) memset(a, b, sizeof(a))23 #define FOPENIN(IN) freopen(IN, "r", stdin)24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)25 template<class T> T CMP_MIN(T a, T b) { return a < b; }26 template<class T> T CMP_MAX(T a, T b) { return a > b; }27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b; }31 32 //typedef __int64 LL;33 //typedef long long LL;34 const int MAXN = 6010;35 const int MAXM = 100005;36 const double eps = 1e-13;37 //const LL MOD = 1000000007;38 39 int N, a[MAXN], dp[MAXN][2];40 int fa[MAXN];41 vector<int>e[MAXN];42 43 void DFS(int u)44 {45 int s0 = 0, s1 = 0;46 for(int i=0;i<e[u].size();i++)47 {48 DFS(e[u][i]);49 s0 += MAX( dp[e[u][i]][0], dp[e[u][i]][1] );50 s1 += dp[e[u][i]][0];51 }52 dp[u][0] = s0;53 dp[u][1] = s1 + a[u];54 }55 56 int main()57 {58 //FOPENIN("in.txt");59 while(~scanf("%d", &N))60 {61 mem0(dp);62 for(int i=1;i<=N;i++)63 {64 scanf("%d", &a[i]);65 fa[i] = i;66 e[i].clear();67 }68 int x, y;69 while(scanf("%d %d", &x, &y) && (x||y) ){70 e[y].push_back(x);71 fa[x] = y;72 }73 int ans = 0;74 for(int i=1;i<=N;i++) if(fa[i] == i)75 {76 DFS(i);77 ans += MAX(dp[i][0], dp[i][1]);78 }79 printf("%d\n", ans);80 }81 return 0;82 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。