ZOJ2834--Maximize Game Time(树形DP)
写之前觉得很恶心,写完了觉得挺好玩了,1A,棒棒哒~
题解全在代码注释中了,想清楚思路一路写下了果然没怎么卡 ^_^
/*******************************************************
Memory: 316 KB Time: 0 MS
Language: C++ (g++ 4.7.2) Result: Accepted
*******************************************************/
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <complex>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
using namespace std;
#define PI acos(-1.0)
#define EXP exp(1.0)
#define ESP 1E-6 /**
什么恶心题!话说最后还是想不到一点无耻的看了别人的题解,竟然是暴力orz,暴力出奇迹。。果然还是太弱啊啊啊啊! 思路基本自己想的,突然觉得图论挺好玩的嘛~~ 题意:n个怪物0~n-1,打死每个怪物有一个时间,怪物家族的结构是一个树形。其中n-1一定是根。如果要打死一个怪物的两个儿子,
那么就需要打死该怪物。打死怪物n-1游戏立即结束。求最长的游戏时间。 想法:这个树形结构的家族可能是一个森林。对于根不是n-1的树,全部杀死。对于n-1,杀光一颗子树,杀掉一个子儿子,
该儿子处理方式同n-1,其他儿子全部不能杀死,意味着其他儿子的儿子只能杀死一个。。。
*/ const int N = 1005; int T[N];
vector<int> G[N];
int root[N]; int sz[N];
int one[N];
int ans[N]; int n; // 求每个结点子树时间和(包括该点)
void dfs_sz(int v)
{
sz[v] = T[v];
for (unsigned i = 0; i < G[v].size(); ++i)
{
int u = G[v][i];
dfs_sz(u);
sz[v] += sz[u];
}
} // 我觉得我的名字起得特别棒(不包括该节点
void dfs_one_son(int v)
{
if (one[v] != -1) return ;
int temp = 0;
int tol = 0;
for (unsigned i = 0; i < G[v].size(); ++i)
{
int u = G[v][i];
dfs_one_son(u);
tol += one[u];
}
for (unsigned i = 0; i < G[v].size(); ++i)
{
int u = G[v][i];
temp = max(temp, tol - one[u] + sz[u]);
}
one[v] = temp;
} void dfs_solve(int v)
{
if (ans[v] != -1) return ;
int temp = 0;
int tol = 0; if (G[v].size() == 0)
{
ans[v] = T[v];
return ;
}
if (G[v].size() == 1)
{
int u = G[v][0];
dfs_solve(u);
ans[v] = ans[u] + T[v];
return ;
} for (unsigned i = 0; i < G[v].size(); ++i)
{
int u = G[v][i];
dfs_solve(u);
tol += one[u];
}
for (unsigned i = 0; i < G[v].size(); ++i) // 我看别人的代码就是这里。。就一眼。。没想到用两层循环。。。
{
int u = G[v][i];
for (unsigned j = 0; j < G[v].size(); ++j)
{
if (i == j) continue;
int k = G[v][j];
temp = max(temp, tol - one[u] - one[k] + sz[u] + ans[k]);
}
}
//printf("temp=%d,T[%d]=%d\n", temp, v, T[v]);
ans[v] = temp + T[v];
} int main()
{
while (~scanf("%d", &n) && n)
{
/// initialize
memset(one, -1, sizeof one);
memset(ans, -1, sizeof ans);
for (int i = 0; i <= n; ++i) G[i].clear(); /// input
for (int i = 0; i < n; ++i)
scanf("%d", &T[i]);
int a;
for (int i = 0; i < n; ++i)
{
scanf("%d", &a);
root[i] = a;
G[a].push_back(i);
} /// solve
int res = 0;
for (int i = 0; i < n - 1; ++i)
if (root[i] == -1)
{
dfs_sz(i);
res += sz[i];
} dfs_sz(n - 1);
dfs_one_son(n - 1);
dfs_solve(n - 1); res += ans[n - 1]; printf("%d\n", res); // for (int i = 0; i < n; ++i)
// {
// printf("%d:%d,%d,%d\n", i, sz[i], one[i], ans[i]);
// }
}
return 0;
}
ZOJ2834--Maximize Game Time(树形DP)的更多相关文章
- 杭电OJ——1011 Starship Troopers(dfs + 树形dp)
Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a ba ...
- hdu 3660 Alice and Bob's Trip(树形DP)
Alice and Bob's Trip Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU-1011 Starship Troopers(树形dp)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- 洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)
P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for c ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
随机推荐
- 中国.net域名网站的“前世今生”,那些年的光辉
1987年9月的一天,中国的第一封电子邮件成功发出,邮件的内容大致是“跨越长城,走向世界”,在当时,没有人会想到十年后中国的互联网开始萌芽,并发展成今天的繁荣.1994年,“巴黎统筹委员会”的解散消除 ...
- Core管道中的处理流程3
通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的? 在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下 ...
- C#基础|初探反射
什么是反射 我们编写的C#代码都可以编译成exe文件或dll文件.暂时先把他们叫做程序集吧,程序集中包含了很多信息.你写了一个类,类中会有字段,有属性,有方法,编译是会把这些信息保存在程序集中,暂时把 ...
- sum(iterable[, start]) 对集合求和
>>> LL [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21] >>> L [3, 4, 5, 6, 7, 8, 9] >> ...
- 背景CSS
.op_weather4_twoicon_day:hover .op_weather4_twoicon_hover { background-image: -webkit-linear-gradien ...
- 【NOIP 2013 DAY2 T3】 华容道(spfa)
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
- ASP.NET MVC 入门3、Routing
本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和& ...
- 【Linux安全】文件或目录权限设置
实例演示: 要求:新建文件夹,名称为secure,要求改文件夹只能被创建者deadmin以及与deadmin同组用户进行读.写.执行的权限, 其他用户均只有读的权限. 查看 一下secure原本的权限 ...
- Linux进程创建和结束
在Linux中,进程的创建由系统调用fork和vfork完成.它们生成一个子进程并且子进程是父进程的一个复制品. Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel ...
- [HDU 4433]locker[DP]
题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...