tyvj 1052 没有上司的舞会 树形DP

这篇博客介绍了如何使用树形动态规划(Tree DP)解决一个关于舞会的数学问题。在这个问题中,每个人都有一个高兴指数,且每个人都可能有一个上司。目标是确定在确保没有上司参加的情况下,最大化舞会的总高兴指数。博主通过定义状态`f[i][0]`(节点i不出席的最大高兴指数)和`f[i][1]`(节点i出席的最大高兴指数),并进行深度优先搜索(DFS)遍历树形结构,最终求解出最大高兴指数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
From Admin
没有上司的舞会
 
   
   
 描述 Description  
  Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
   
   
 输入格式 Input Format 
  第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
   
   
 输出格式 Output Format 
  输出最大的快乐指数。
   
   
 样例输入 Sample Input [复制数据] 
 
   
   
 样例输出 Sample Output [复制数据] 
 
   
   
 时间限制 Time Limitation 
  各个测试点1s

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n;//人数
int h[6000];//高兴指数
vector<int> G[6000];//下属
int boss[6000];//老板
int f[60000][2];//以i为根,f[i][1]表示i出席的最大值,f[i][0]表示i不出席的最大值
void dfs(int k)
{
    for(int j=0;j<G[k].size();j++)
    {
        int i=G[k][j];
        dfs(i);
        //如果老板出席,那么他的手下就不出席
        f[k][0]+=max(f[i][0],f[i][1]);
        f[k][1]+=f[i][0];
    }
    f[k][1]+=h[k];
}
int main()
{
    while(scanf("%d",&n)==1)
    {
        for(int i=1;i<=n;i++) scanf("%d",&h[i]);
        memset(boss,0,sizeof(boss));
        memset(f,0,sizeof(f));
        int x,y;
        while(scanf("%d%d",&x,&y)==2,x||y)
        {
            G[y].push_back(x);
            boss[x]=y;
        }
        for(int i=1;i<=n;i++)
        {
            if(boss[i]==0)//根节点
            {
                dfs(i);//树形DP
                printf("%d/n",max(f[i][0],f[i][1]));
                break;
            }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值