描述

Arthur公司是一个等级森严的公司,它们有着严格的上司与下属的关系,公司以总裁为最高职位,他有若干个下属,他的下属又有若干个下属,他的下属的下属又有若干个下属……现接近年尾,公司组织团拜活动,活动中有一部分是自由舞会,公司的每个职员都有一个搞笑值,现要你制定一套哪些人上台的方案,使得台上所有演员的搞笑值最大。当然,职员们是不会和他们的顶头上司一起上台的。

格式

输入格式

第一行一个整数N,表示这个公司总共的职员个数。

接下来一行有N个整数,由空格隔开,第i个整数表示职员i的搞笑值Ai(-1327670≤Ai≤1327670)。

接下来N-1行,每行一个1到N的整数,第i个整数表示职员i+1的顶头上司是谁,当然总裁就是职员1。

输出格式

一个整数,表示台上所有职员搞笑值之和的最大值。

输入:

7
1 1 1 1 1 1 1
1
1
5
1
4
4

输出:

5

没有上司的舞会问题

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN=;
typedef long long ll;
int n;
int v[MAXN];
vector<int> tree[MAXN];
ll dp[MAXN][];
void dfs(int u)
{
dp[u][]+=v[u];
for(int i=;i<tree[u].size();i++)
{
int v=tree[u][i];
dfs(v);
dp[u][]+=max(dp[v][],dp[v][]);
dp[u][]+=dp[v][];
}
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>v[i];
}
for(int i=;i<=n;i++)
{
int fa;
cin>>fa;
tree[fa].push_back(i);
}
dfs();
cout<<max(dp[][],dp[][])<<endl; return ;
}

最新文章

  1. require() 源码解读
  2. web api添加拦截器
  3. Android开机动画
  4. [LeetCode] Longest Increasing Path in a Matrix 矩阵中的最长递增路径
  5. SQL Server 2005导入Excel表问题
  6. java 中集合和数组互相转换
  7. 《Head First设计模式(中文版)》
  8. Shell 脚本基本操作练习
  9. 静态页面中如何传json数据
  10. selenium之多线程启动grid分布式测试框架封装(三)
  11. Lucene简介(理论篇)
  12. x64内核HOOK技术之拦截进程.拦截线程.拦截模块
  13. python判断两个变量是否为同一数据类型
  14. 用Python来操作redis 以及在Django中使用redis
  15. log4j日志日记记录使用教程
  16. Microsoft SQL Server 2012 管理 (2): 实例与数据库管理
  17. Valid Sudoku&amp;&amp;Sudoku Solver
  18. Centos bash: make: command not found
  19. 开源IDS系列--snorby 2.6.2 undefined method `run_daily_report&#39; for Event:Class (NoMethodError)
  20. selenium webdriver模拟鼠标键盘

热门文章

  1. Java语言平台
  2. Django 模型系统(model)&amp;ORM--进阶
  3. linux c编程:信号(三) sigprocmask和sigpending函数
  4. spring项目改名后不能启动的原因及解决办法
  5. 33_为应用添加多个Activity与参数传递
  6. action extension添加图标
  7. 每天一个Linux命令(30)ln命令
  8. ubuntu下单网卡绑定多个IP
  9. [原创]java WEB学习笔记29:Cookie Demo 之自动登录
  10. Python 3 常用模块之 一