Ural 1039 没有上司的晚会

Ural 1039 没有上司的晚会

 

背景

 

有个公司要举行一场晚会。

为了能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会邀请他的上司

(上司的上司,上司的上司的上司……都可以邀请)。

 

题目

 

每个参加晚会的人都能为晚会增添一些气氛,求一个邀请方案,使气氛值的和最大。

 

输入格式

 

第1行一个整数N(1<=N<=6000)表示公司的人数。

接下来N行每行一个整数。第i行的数表示第i个人的气氛值x(-128<=x<=127)。

接下来每行两个整数L,K。表示第K个人是第L个人的上司。

输入以0 0结束。

 

输出格式

 

一个数,最大的气氛值和。

 

样例输入

 

7

1

1

1

1

1

1

1

1 3

2 3

6 4

7 4

4 5

3 5

0 0

 

样例输出

 

5

提交地址:

http://acm.timus.ru/submit.aspx?space=1&num=1039




方法:树形DP

因公司的人际关系为一棵树,假设编号为root的节点是树的根,则问题可以描述成f[root]表示求以root为根的树上能得到的最大气氛和。我们希望用root的儿子的对应信息来推出f[root].

由于节点root 有选和不选两种可能,所以当我们root节点选择时,需要它的子节点不选时的最大值,当root节点不选时,它的子节点选和不选都可以。所以我们需要加半维来表示树的根结点是否选取才能从子树推算出父亲的最大值。

定义状态f[i,j]表示以i为根的树能得到的最大的气氛和,j=0时表示根节点不选,j=1时表示根节点要选。状态转移方程为

F[i,0]=Σmax(f[son,1],f[son,0]);其中soni的子节点。

F[i,1]=Σf[son,0]+g[i];其中g[i]表示节点i的气氛值。

答案是max(f[root,0],f[root,1]) root为整棵树的根。

时间复杂度为ON

空间复杂度为ON

参考代码(AC)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int f[6001][2],father[6001];
bool v[6001];
int n;
int find_max(int a,int b)
{
    if (a>b) return a;
    else return b;
}
void dfs(int k)
{
    v[k]=false;
    for (int i=1;i<=n;i++)
        if (v[i] && father[i]==k)
        {
            dfs(i);
            f[k][0]+=f[i][1];
            f[k][1]+=find_max(f[i][0],f[i][1]);
        }
}
int main()
{
	freopen("上司.txt","r",stdin); 
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",&f[i][0]);
    int l,k,root;
    root=0;
	int bk=1;
    while (scanf("%d%d",&l,&k),l+k>0)
    {
        father[l]=k;
        if (root==l || bk==0)
        {
            root=k;bk=0;
        }
    }
    memset(v,1,sizeof(v));
    dfs(root);
    printf("%d\n",find_max(f[root][0],f[root][1]));
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值