vijos 1418 公司聚会

题目描述

dd_engi所在的TIANYI公司要举办一次盛大的公司聚会。可惜的是,由于场地和花费的原因,不可能所有人都参加。现在的任务是拟定参加聚会人员的名单。
TIANYI公司的组织架构可以看做一棵有根多叉树。也就是说,在编号为1~N的所有N名员工中,除了最高管理者(编号为1)以外,每个员工都有且仅有一位直接上司;最高管理者则是这棵多叉树的“根”。这很好理解,对吗?另外,我们保证,员工的编号会大于他的直接上司的编号。
不同的员工对于聚会有着不同的要求,事实上,若邀请第i位员工(编号为i),在聚会中满足他的要求需要花费Ci元。另一方面,不同的员工在聚会中的“兴奋指数”也不同,第i位员工参加聚会的兴奋指数是Ei。
选择参加聚会的人员还有一个限制:为了使参加聚会的员工能够尽量放松,若邀请了某位员工,就不能邀请他的任何一位上司。这里“上司”的定义是这样的:最高管理者没有上司,其余所有员工的直接上司以及直接上司的所有上司都是他的上司。换句话说,某位员工的上司就是树中从他的节点走到根节点的路径上经过的所有节点(包括根结点,但不包括他自身)。
在满足上述限制的前提下,dd_engi希望参加聚会人员的兴奋指数之和最大,但同时他被告知,满足所有参加聚会人员的要求的总花费不得超过M元。那么,参加聚会人员的名单究竟应该怎样确定才最优呢?你需要求出的是最大的总兴奋指数。

输入格式
第一行,两个空格隔开的整数,N与M。
第二行,N-1个整数,分别是第2位至第N位员工的直接上司的编号。
第三行,N个整数,分别是C1、C2……CN。
第四行,N个整数,分别是E1、E2……EN。
输出格式
只需输出一行一个整数,即最大的总兴奋指数。

In

10 100
1 2 2 1 4 3 5 6 1
12 53 127 32 164 22 199 10 19 17
-1 0 3 5 7 -2 9 6 8 13

Out
27


貌似是个树形dp,其实不然

抄了老半天题解终于过了,……………………….(还好意思说)
当然需要总结一下
原来copy的题解

http://blog.csdn.net/your_own_name/article/details/52779715

基本保留树形结构,比较好理解;

当然其他方法也是要有的

sh的代码

#include<cstdio>
#include<algorithm>
using namespace std;
int fa[10000],f[1050][1050],n,m,c[10000],e[10000];
int main(){
 scanf("%d%d",&n,&m);
 for(int i=1;i<=n-1;i++)
  scanf("%d",&fa[i+1]);
 for(int i=1;i<=n;i++)
  scanf("%d",&c[i]);
 for(int i=1;i<=n;i++)
  scanf("%d",&e[i]);

 for(int i=n;i>=1;i--){
  for(int j=c[i];j<=m;j++)
   f[i][j]=max(f[i][j],e[i]);

  for(int j=m;j>=0;j--)
   for(int k=0;k<=j;k++)
    f[fa[i]][j]=max(f[fa[i]][j-k]+f[i][k],f[fa[i]][j]);
 }

 printf("%d",f[1][m]); 
 return 0;
} 

题目中有一个特殊的性质

我们保证,员工的编号会大于他的直接上司的编号。

因此只要倒序搜索,就可以确保在更新每一个结点的时候其所有的儿子已经被更新,这这样就可以避免建树,而对于子结点的更新,跑一遍01背包就好了;对于每个结点,先更新它的的儿子,然后在更新至这一个结点的时候,因为其儿子已经被搜过,所以直接判断是选取其儿子还是选择自己比较优;方程便可写出:
F[i][j]代表在i结点处,花费j所得到的最大价值;

p.s:此题的顺序比较神,需要彻底理解题意才可以写对。尤其是背包倒着正着,理解太差,写错了好几次。
对于树型动规上加01背包的题目还是头一次见;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值