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.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...
随机推荐
- iOS多线程编程之多线程简单介绍(转载)
一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“ ...
- 坐标转换convertRect
// 目标view的直接父viwe 目标view 要转换到的view [self.backgr ...
- flask 日志
https://www.polarxiong.com/archives/Flask%E4%BD%BF%E7%94%A8%E6%97%A5%E5%BF%97%E8%AE%B0%E5%BD%95%E5%8 ...
- java.io.File实战
There are many things that can go wrong: A class works in Unix but doesn't on Windows (or vice versa ...
- dedecms批量导出新增文章url和标题
百度站长工具推出主动提交功能有一段时间了,可以将新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录.那么dedecms如何批量导出新增文章url呢?你可以用标签调用最新文章,可以用sq ...
- git分支名一直带rebasing,如何去除
git分支名一直rebasing, 使用git rebase --continue git rebase --skip git reset --abort 都没有用, 最后直接删除 当前目录下的.gi ...
- Py中的多维数组ndarray学习【转载】
转自:http://blog.sciencenet.cn/home.php?mod=space&uid=3031432&do=blog&id=1064033 1. NumPy中 ...
- Linux定时任务出现问题时正确的解决步骤
但凡是提供服务的,都要有本账.软件服务也不例外.无论是Apache,Nginx,还是我们自己搭建的网站,日志是标配.这里的日志就是一本账. 当定时任务出现问题时,正确的处理步骤是: 1,定时任务服务是 ...
- Java 7代码层面上的更新
Java 7已经完成的7大新功能: 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: ...
- Vue.Js加入bootstrap及jquery,或加入其他插件vue-resource,vuex等
.引入jquery 项目目录下输入 cnpm install jquery --save-dev 用npm下载jq依赖 若想加入其他js库,如vue-resource,执行命令cnpm in ...