写之前觉得很恶心,写完了觉得挺好玩了,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知识,有个编程题设计团购秒杀方面的设计,之前没有这种经验做的不好,做完题一个技术经理过来面试,主要问了一下之前做的什么项目,对struts,spring的原理做 ...

  2. ASP.NET MVC 3 Razor Views in SharePoint

    http://tqcblog.com/2011/01/22/asp-net-mvc-3-razor-views-in-sharepoint/ ASP.NET MVC 3 has just been r ...

  3. Grails的redirect无法跳转时的一个可能原因

    由于controller的命名一般首字母大写,如Login 此时如 class LoginController { def index = { redirect(action:Login, param ...

  4. 如何避免远程循环执行SSH时,到第一条之后就退出

    RT 今天遇到的小问题,记录下来. 据说关键是加  < /dev/null 我也是看网上别人说的,测试成功. #!/bin/bash while read line do echo $line ...

  5. php smarty 缓存和配置文件的基本使用方法

    smarty高级部分包括缓存机制和配置文件的调用 下面是代码实现: 文件一,配置文件: #全局变量 title="网站主页" content="一个网站的主体部分&quo ...

  6. linux命令ps aux|grep xxx详解

    对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在运 ...

  7. 李洪强漫谈iOS开发[C语言-016]-变量的作用域

  8. QT 的信号与槽机制介绍

    https://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/ http://www.kuqin.com/qtdocume ...

  9. Android进阶篇-时间滑动控件

    仿Iphone时间选择滑动控件: WheelView.java: /** * @author Administrator * * 时间滑动滚轮 */ public class WheelView ex ...

  10. [译]GotW #3: Using the Standard Library (or, Temporaries Revisited)

    高效的代码重用是良好的软件工程中重要的一部分.为了演示如何更好地通过使用标准库算法而不是手工编写,我们再次考虑先前的问题.演示通过简单利用标准库中已有的算法来避免的一些问题. Problem JG Q ...