树形DP Tyvj1052 没有上司的舞会
P1052 没有上司的舞会
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
输入格式
第一行一个整数N。(1<=N<=3000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
输出格式
输出最大的快乐指数。
测试样例1
输入
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
输出
5这很显然是一个树形DP的裸题
神犇讲的最大独立集等一大堆高深的东西完全不懂啊
悲伤逆流成河
f[i][0/1]分别是否参加
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 7 using namespace std; 8 int n; 9 int root; 10 struct data{ 11 int val; 12 int fa; 13 vector<int> ch; 14 }t[10010]; 15 int f[10010][2]; 16 17 void dp(int x){ 18 f[x][1]=t[x].val; 19 f[x][0]=0; 20 if(t[x].ch.empty()) return; 21 for(int i=0;i<t[x].ch.size();i++){ 22 int q=t[x].ch[i]; 23 dp(q); 24 f[x][0]=max(f[x][0],max(f[x][0]+f[q][1],f[x][0]+f[q][0]));//不选x 选儿子q?不选儿子q? 25 f[x][1]=max(f[x][1],f[x][1]+f[q][0]);//选x 必不可选其父和子 26 } 27 return; 28 } 29 30 int main(){ 31 scanf("%d",&n); 32 for(int i=1;i<=n;i++) scanf("%d",&t[i].val); 33 int x=0,y=0; 34 for(int i=1;i<=n;i++){//=n吞0 0 35 scanf("%d%d",&x,&y); 36 t[x].fa=y; 37 t[y].ch.push_back(x); 38 } 39 root=1; 40 while(t[root].fa) root=t[root].fa; 41 dp(root); 42 printf("%d\n",max(f[root][0],f[root][1])); 43 return 0; 44 }