acwing 285. 没有上司的舞会

活动 - AcWing

树形dp

f[i][0/1] 表示以i为根节点的子树当选择i或者不选择i时的最大快乐值

对于f[i][1] 也就是我们选择 i 所以进入dfs 我们先将w[i] 加入 f[i][1] 中,然后,我们对于 i 各个孩子,我们都不能取 (因为不能有直接上司),所以我们加 f[j][0](也就是说我们加上不取 j 的时候最大快乐值)

对于f[i][0] 也就是我们不选择 i 所以我们可以 1.取子树 f[j][1]  2 . 不取子树 f[j][0] , 两者之间取最大值 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>

using namespace std ;
const int N = 6010 ;

vector<int> tree[N] ;//存邻接表 
int f[N][2] ;//表示以i为结点的子树,当取i 或着 不取i时 的最大快乐值 
int has_fa[N] ;//记录每一个点是否有父节点,方便找根节点 
int n ;
int w[N] ;//每一个节点的快乐值 
void dfs(int u){
	f[u][1] = w[u] ;
	for(int i = 0 ; i < tree[u].size() ; i ++){
		int j = tree[u][i] ;
		dfs(j) ;
		f[u][1] += f[j][0] ;
		f[u][0] += max(f[j][0],f[j][1]) ; 
	}
}
int main(){
	cin >> n ;
	for(int i = 1 ; i <= n ;i ++) cin >> w[i] ;
	for(int i = 1 ; i < n ;i ++){
		int a , b ; cin >> a >> b ;
		tree[b].push_back(a) ;
		has_fa[a] = 1 ;
	}
	int root = 1 ;
	while(has_fa[root]) root ++ ;
	dfs(root) ;
	printf("%d\n",max(f[root][0],f[root][1])) ;
	return 0 ;
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值