没有上司的舞会[树形DP]

没有上司的舞会[树形DP]

题面

285. 没有上司的舞会 - AcWing题库

某大学有 n 个职员,编号为 1n

他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。

现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数 ri,但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。

所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

输入格式

输入的第一行是一个整数 n

2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数表示 i 号职员的快乐指数 ri

(n+2) 到第 2n 行,每行输入一对整数 l,k,代表 kl 的直接上司。

输出一行一个整数代表最大的快乐指数。

数据规模

对于 100% 的数据,保证 1n6×103128ri1271l,kn,且给出的关系一定是一棵树。

思路

xy 的上司

那么以 x 为树根时的答案就是 ansx=max(ansy,ansy)

树形DP很容易看出状态转移方程

从树根往下搜再往上返回答案即可

const int N=6e3+10;
int n,m;
int val[N];
bool st[N];
int f[N][2];
vector<int>s[N];
void dp(int x){
	f[x][1]=val[x];
	for(auto it:s[x]){
		dp(it);
		f[x][0]+=max(f[it][0],f[it][1]);
		f[x][1]+=f[it][0];
	}
}
void solve(){
	//try it again.
	cin>>n;
	up(1,n)cin>>val[o];
	up(2,n){
		int l,r;
		cin>>l>>r;
		s[r].pb(l);
		st[l]=true;
	}
	int root;
	up(1,n){
		if(!st[o]){
			root=o;//找树根
			break;
		}
	}
	dp(root);
	cout<<max(f[root][0],f[root][1])<<endl;
}

本文作者:liangqianxing

本文链接:https://www.cnblogs.com/liangqianxing/p/17207468.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   liangqianxing  阅读(76)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起