codevs 1380 没有上司的舞会 - 树形动态规划
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
输出最大的快乐指数。
各个测试点1s
按照这个关系建一棵树,然后进行树归,用f[i]表示i职员参加舞会的最大快乐指数之和,g[i]表示i职员不参加舞会的最大快乐指数之和。那么有f[i]为所有i的子节点的g[son[i]]的和,g[i]是i的子节点的g[son[i]]和f[son[i]]最大值的和。
最后的答案在f[1]和g[1]中找最大值。
Code
- /**
- * codevs
- * Problem#1380
- * Accepted
- * Time:10ms
- * Memory:492k
- */
- #include<iostream>
- #include<sstream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cctype>
- #include<cmath>
- #include<ctime>
- #include<map>
- #include<stack>
- #include<set>
- #include<queue>
- #include<vector>
- #ifndef WIN32
- #define AUTO "%lld"
- #else
- #define AUTO "%I64d"
- #endif
- using namespace std;
- typedef bool boolean;
- #define inf 0xfffffff
- #define smin(a, b) (a) = min((a), (b))
- #define smax(a, b) (a) = max((a), (b))
- template<typename T>
- inline boolean readInteger(T& u) {
- char x;
- int aFlag = ;
- while(!isdigit((x = getchar())) && x != '-' && x != -);
- if(x == -) {
- ungetc(x, stdin);
- return false;
- }
- if(x == '-') {
- aFlag = -;
- x = getchar();
- }
- for(u = x - ''; isdigit((x = getchar())); u = u * + x - '');
- u *= aFlag;
- ungetc(x, stdin);
- return true;
- }
- typedef class Edge {
- public:
- int end;
- int next;
- Edge(const int end = , const int next = ):end(end), next(next) { }
- }Edge;
- typedef class MapManager {
- public:
- int ce;
- int *h;
- Edge *edge;
- MapManager():ce(), h(NULL), edge(NULL) { }
- MapManager(int points, int edges):ce() {
- h = new int[(const int)(points + )];
- edge = new Edge[(const int)(edges + )];
- memset(h, , sizeof(int) * (points + ));
- }
- inline void addEdge(int from, int end) {
- edge[++ce] = Edge(end, h[from]);
- h[from] = ce;
- }
- Edge& operator [](int pos) {
- return edge[pos];
- }
- }MapManager;
- #define m_begin(g, i) (g).h[(i)]
- int n;
- int *val;
- MapManager g;
- int *f, *g1;
- int root;
- inline void init() {
- readInteger(n);
- val = new int[(const int)(n + )];
- g = MapManager(n, n);
- f = new int[(const int)(n + )];
- g1 = new int[(const int)(n + )];
- for(int i = ; i <= n; i++)
- readInteger(val[i]);
- int sum = ;
- for(int i = , a, b; i < n; i++) {
- readInteger(a);
- readInteger(b);
- sum += a;
- g.addEdge(b, a);
- }
- root = n * (n + ) / - sum;
- }
- void treedp(int node, int fa) {
- g1[node] = ;
- f[node] = val[node];
- for(int i = m_begin(g, node); i != ; i = g[i].next) {
- int& e = g[i].end;
- if(e == fa) continue;
- treedp(e, node);
- g1[node] += max(g1[e], f[e]);
- f[node] += g1[e];
- }
- }
- inline void solve() {
- treedp(root, );
- printf("%d", max(g1[root], f[root]));
- }
- int main() {
- init();
- solve();
- return ;
- }
codevs 1380 没有上司的舞会 - 树形动态规划的更多相关文章
- wikioi 1380 没有上司的舞会 树形dp
1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他 ...
- Codevs 1380 没有上司的舞会
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就 ...
- 树形DP--codevs 1380 没有上司的舞会
codevs 1380 没有上司的舞会 变式题目:给定一棵树每个点有一个点权,求一个独立集使得点权和最大,树上的独立集指的是选取树上的点,使尽量多的点不直接相连 时间限制: 1 s 空间限制: 1 ...
- CodeVS1380 没有上司的舞会 [树形DP]
题目传送门 没有上司的舞会 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个 ...
- 『没有上司的舞会 树形DP』
树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...
- 洛谷P1352 没有上司的舞会——树形DP
第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...
- P1352 没有上司的舞会——树形DP入门
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...
- P1352 没有上司的舞会&&树形DP入门
https://www.luogu.com.cn/problem/P1352 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...
- [luogu]P1352 没有上司的舞会[树形DP]
本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...
随机推荐
- 【紫书】Tree UVA - 548 静态建树dfs
题意:给你中序后序 求某叶子节点使得从根到该节点权值和最小.若存在多个,输出其权值最小的那个. 题解:先建树,然后暴力dfs/bfs所有路径,取min 技巧:递归传参数,l1,r1,l2,r2, su ...
- SAPI
https://en.wikipedia.org/wiki/Server_Application_Programming_Interface In computing, Server Applicat ...
- the internal array pointer
The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and ...
- HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- (转)Spring实现IoC的多种方式
原文地址:http://www.cnblogs.com/best/p/5727935.html 目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实 ...
- 洛谷P2444 病毒 [POI2000] AC自动机
正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...
- html 1:1比例显示
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...
- 自定义Metrics:让Prometheus监控你的应用程序
前言 Prometheus社区提供了大量的官方以及第三方Exporters,可以满足Prometheus的采纳者快速实现对关键业务,以及基础设施的监控需求. 如上所示,一个简单的应用以及环境架构.一般 ...
- PHP导出excel时数字变为科学计数的解决方法
在数据导出到excel时数字格式不对,一般分为以下两种情况. 1.excel单元格设置长度不够 解决方法: //在excel.php文件中 $objActSheet = $objPHPExcel-&g ...
- excel用法
1:求大于某一值的个数:使用COUNTIF(区间,标准) 要大写 =COUNTIF(B2:B48,">=95") 2:求某一区间的个数用:大区间个数减小区间个数 =CO ...