LDUOJ——没有上司的晚会(树形DP)

简介: LDUOJ——没有上司的晚会(树形DP)

原题链接

题意:

给一棵树,每个点都有权值a[i],要求从中选若干个点,满足该点和其父亲节点不能同时被选择,求最大权值。

思路:

一般树形DP的第一维都是子树的编号,我们用dp[i]表示选完以i为根节点的子树能够获得的最大权值。

一个点是否被选择,和他的父节点是否被选择有关,在此基础上再加一维度表示该点是否被选择,即dp[i] [0]表示不选择节点i且选完以i为根节点的子树能够获得的最大权值,dp[i] [1]表示选择节点i且选完以i为根节点的子树能够获得的最大权值。

再来考虑状态转移,因为子节点和父节点不能被同时选择,所以当选择父节点时,就不能再选择直接的子节点,即dp[i][1]=a[i]+max(dp[j][0]) j∈i的子树;当不选择父节点时,是否选择子节点都可以,即dp[i][0]=max(dp[j][0],dp[j][1]),j∈i的子树;

答案即max(dp[root][0],dp[root][1]);

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=6000+100;
vector<int>v[maxn];
bool st[maxn];///是否没有上司
int a[maxn];///快乐指数
int n;
int dp[maxn][2];
void dfs(int u){
    dp[u][1]=a[u];
    for(auto t:v[u]){
        dfs(t);
        dp[u][1]+=dp[t][0];
        dp[u][0]+=max(dp[t][0],dp[t][1]);
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<n;i++){
        int l,k;
        cin>>l>>k;
        ///k是l的直接上司 k指向l
        st[l]=1;
        v[k].push_back(l);
    }
    int root=1;
    while(st[root]) root++;
    dfs(root);
    cout<<(max(dp[root][0],dp[root][1]));
    return 0;
}

参考:《算法竞赛进阶指南》


目录
相关文章
利用“资源整合”赚钱,日赚千元不是梦
这段时间以来听到好多网友谈利用资源整合挣钱的方法。这些方法听起来是非常的不错,比如把网上一些免费的源码,免费的软件或者视频教程给整理起来。然后把这些资源分享给大家,有些还可以收费。以前贼财迷也感觉不错,可是,想来想去真不知道该弄些什么,因为我能想到的都已经被别人给弄了。
2880 0
|
大数据 视频直播 定位技术
旅游业自救渡劫:不能只靠直播带货
旅游业自救渡劫:不能只靠直播带货
521 0
旅游业自救渡劫:不能只靠直播带货
|
视频直播
直播带货系统源码如何举稳直播带货风潮下的大旗
直播带货系统的风潮居高不下,目前效率最高的带货方式好像就是最近极其火爆的直播了
直播带货系统源码如何举稳直播带货风潮下的大旗
9月7月科技联播:程维确认滴滴上半年亏损40亿元,子弹短信未来六个月将烧10亿拉新
互联网出行到底是不是一个应该存在的行业?程维回应锥心之问:滴滴绝不是一家黑心企业!子弹短信上线半个多月后,罗永浩再放话,要烧10个亿来拉新;百度销售体系再换血,顾国栋晋升业务副总裁,一起来看今天的科技快讯!
1571 0
|
人工智能 自然语言处理 小程序
既然直播能带货,为何还要“云逛街”?
没有流量背书时,品牌需要新方法增加消费者的停留时间。
|
搜索推荐 新零售
阿里无人超市 “微笑打折”成世界互联网大会热点
12月3日至5日,在第四届世界互联网大会.乌镇峰会期间,天猫无人超市作为唯一独立参展项目,惊艳亮相。
4613 0