anniversary party_hdu1520
本来以为是一道很简单的提,可以分分钟解决(实际上就是很简单)
然而一直报错,找半天,竟然要多组输入(还是太菜了)
所以每组需要先初始化,
这是一道树形DP的简单题,具体思路就是我选这个上司就不能选他的直属下级,如果不选这个上司,那么选不选他的直属下级要看rate怎么样
接下来放代码:
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=6001;
int dp[N][2],father[N];//rate[N];
vector<int>tree[N];
int n;
void dfs(int fa){
dp[fa][0]=0;
//dp[fa][1]=rate[fa];
for(int i=0;i<tree[fa].size();i++){
int child=tree[fa][i];
dfs(child);
dp[fa][0]+=max(dp[child][0],dp[child][1]);
dp[fa][1]+=dp[child][0];
}
}
int main()
{
//while(~scnaf("%d",&n)){
while(cin>>n){
for(int i=1;i<=n;i++){
scanf("%d",&dp[i][1]);
tree[i].clear();
father[i]=0;
}
int x,y;
scanf("%d%d",&x,&y);
while(x&&y){
tree[y].push_back(x);
father[x]=y;
scanf("%d%d",&x,&y);
}
int t=1;
while(father[t])t=father[t];
/*
int ans=0;
for(int i=1;i<=n;i++){
if(!father[i]){
dfs(i);
ans+=max(dp[i][0],dp[i][1]);
}
}
cout << ans << endl;
*/
dfs(t);
cout << max(dp[t][0],dp[t][1]) << endl;
}
return 0;
}
最新文章
- Linux最常用命令的小总结
- windows phone listbox的点击事件
- maven打包忽略测试用例
- 中国IT人,你们是否从没想过开发一款伟大的产品?
- 用BenchmarkDotNet给C#程序做性能测试
- vijosP1210 盒子与球
- C++学习笔录4
- 电脑中安装多个jdk,eclipse的选择!
- VS 2017 + opencv4.0
- 做接口自动化时候,一些登录头信息可以通过aop的方式进行增强
- 洛谷P4451 [国家集训队]整数的lqp拆分 [生成函数]
- parted 分区命令
- docker镜像制作 centos6 nginx1.15.6 with NGINX_UPSYNC_MODULE
- SQL中not in 和not exists
- EditText的焦点问题
- IE6.0 PNG背景透明图片插件
- zabbix 实现对服务器的负载监控
- 软件包管理:rpm命令管理-安装升级与卸载
- ThinkPHP 5.x远程命令执行漏洞分析与复现
- Java 分割、合并byte数组