P1352 没有上司的舞会

      ~~~~~      P1352 没有上司的舞会       ~~~~~      总题单链接

思路

      ~~~~~       d p [ u ] [ [ 0 / 1 ] dp[u][[0/1] dp[u][[0/1] 表示第 u u u 个点 [ 不选 / 选 ] [不选/选] [不选/] 的最大值。

      ~~~~~       d p [ u ] [ 1 ] dp[u][1] dp[u][1] 只能用 d p [ v ] [ 0 ] dp[v][0] dp[v][0] 来更新( v v v u u u 的儿子),因为不能同时选一个点和他的儿子。

      ~~~~~       d p [ u ] [ 0 ] dp[u][0] dp[u][0] 可以用 d p [ v ] [ 0 ] dp[v][0] dp[v][0] 来更新,也可以用 d p [ v ] [ 1 ] dp[v][1] dp[v][1] 来更新。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;

vector<ll>eg[6005];
ll n,S,a[6005],din[6005],dp[6006][2];

void dfs(ll p){
	dp[p][1]+=a[p];
	for(ll v:eg[p]){
		dfs(v);
		dp[p][1]+=dp[v][0];
		dp[p][0]+=max(dp[v][0],dp[v][1]);
	}
}

signed main(){
	ios::sync_with_stdio(false);
	
	cin>>n;
	for(ll i=1;i<=n;i++)cin>>a[i];
	for(ll i=1;i<n;i++){
		ll x,y;cin>>x>>y;
		eg[y].push_back(x);
		din[x]++;
	}
	for(ll i=1;i<=n;i++)if(!din[i])S=i;
	
	dfs(S);
	
	cout<<max(dp[S][0],dp[S][1]);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值