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 ...
随机推荐
- Centos 6.2 32位机器安装新的JDK和Weblogic
一.首先卸载自带的JDK 1.查看自带的java版本. root@admin]#java -version java version "1.6.0" OpenJDK Runtime ...
- ibdata1是?
MySQL使用InnoDB引擎的时候,ibdata1这个文件会随着时间的增长,会变得越来越大,占据大量的磁盘空间. 那么,ibdata1里保存了哪些东西,为什么会变得越来越大呢,让我们开看看ibdat ...
- JQ+AJAX实现多级联动
利用JQ与AJAX实现三级联动实现的效果: 当前两级改变时,后边一级或两级都会改变: 使用的数据库: html代码: <!doctype html> <html lang=" ...
- DataGridView自动行号
最近又用了一下DataGridView控件,需要显示行号,我们知道在.net中DataGridView控件默认是不显示行号(数据的记录行数)的,后来通过查资料发现可以在DataGridView控件的R ...
- javascript pattern
bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...
- ubuntu下的翻译软件goldendict
转自ubuntu下的翻译软件 看着一些API虽然能看懂一个大概,但总想知道每个单词的意思.问题是英语水平有限,所以只能来找一些翻译软件,像windows下来用的有道估计是不行了(也没去试到定行不行), ...
- Power Designer 使用技巧总结
1.设置主键自增 在表的属性界面---选择column---双击主键: 2. 为脚本添加注释: 在表的属性界面---选择column分别进行下列设置:
- IDEA 使用 SVN的一个注意点
IDEA是调用SVN.EXE来实现相关版本管理功能的,所以必须要安装visualSVN,然后再使用相关功能!
- 【NOIP 2014 DAY1 T3】飞扬的小鸟(DP)
题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...
- Django Model数据访问Making queries
创建完Model之后, Django 自动为你提供一套数据库抽象层的API,利用它可以完成创建,提取,更新,删除对象的操作. 以下面的Model为例: class Blog(models.Model) ...