写之前觉得很恶心,写完了觉得挺好玩了,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)的更多相关文章

  1. 杭电OJ——1011 Starship Troopers(dfs + 树形dp)

    Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a ba ...

  2. 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 ...

  3. HDU-1011 Starship Troopers(树形dp)

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  4. 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 ...

  5. 洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)

    P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for c ...

  6. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  7. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  8. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  9. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  10. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

随机推荐

  1. Java中的异常处理机制的简单原理和应用

    异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间.地点.人物.情节等信息,可以用一个对象来表示,Java使用面向对象的方式 ...

  2. 一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...

  3. Linux系统架设支持自助开通Shado wsocks及VPN前端的教程

    程序实现:通过网页端注册,自助开通VPN帐号及Shadowsocks帐号.并可实现流量统计 系统要求 Debian 6 x64 纯净系统 by: Lop ①配置环境 apt-get updateapt ...

  4. java连接mysql数据库(jsp显示和控制台显示)

           很多事情,在我们没有做之前我们觉得好难,但是只要你静下心来,毕竟这些都是人搞出来的,只要你是人,那就一定可以明白. 配置:JDK1.8,MySQL5.7,eclipse:Neon Rel ...

  5. [杂题]CSUOJ1276 Counting Route Sequence

    题目链接 题意:从1号点走到n号点(每条边只能走一次, 两结点间的边数必定为奇数) 问 经过结点不同顺序的方式有多少种(如1->2->3->4和1->3->2->4 ...

  6. Qt中的多线程编程

    http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...

  7. 4. 在Inspector面板中显示类中变量+ 拓展编辑器

    1. C#脚本如下: using UnityEngine; using System.Collections; public class MyTest : MonoBehaviour { ; ; [S ...

  8. Using FireMonkey Layouts

    FireMonkey has many layout controls to choose from. Come learn the differences and how to use them t ...

  9. Android Binder设计与实现 - 设计篇

    要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具 ...

  10. windows播放声音

    一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1.      使用mci #include <windows.h> ...