hdu 5325 Crazy Bobo(树形dp)

来源:互联网 发布:淘宝禁止好评返现2016 编辑:程序博客网 时间:2024/04/30 23:52

题目链接:hdu 5325 Crazy Bobo


对于每个点,C[u]表示以u为中点(即w[u]为最小值)的满足子树,点的个数最多个数。每次一个点先优处理处C[u]。再递归向下处理。


#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 500005;int N, W[maxn], C[maxn], ans;vector<int> G[maxn];void init () {ans = 0;memset(C, 0, sizeof(C));for (int i = 1; i <= N; i++) {scanf("%d", &W[i]);G[i].clear();}int u, v;for (int i = 1; i < N; i++) {scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u);}}void dfs (int u, int f, int d) {int& ret = C[u];ret = d + 1;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v == f)continue;if (W[u] > W[v])continue;dfs(v, u, 0);C[u] += C[v];}for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v == f)continue;if (W[u] < W[v])continue;dfs(v, u, C[u]);}}int main () {while (scanf("%d", &N) == 1) {init();dfs(1, 0, 0);int ans = 0;for (int i = 1; i <= N; i++) {ans = max(ans, C[i]);}printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击