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