UVALive 7003 A Balance Game on Trees(树形dp)
来源:互联网 发布:儿童节礼物 知乎 编辑:程序博客网 时间:2024/05/29 16:30
题目链接:
UVALive 7003 A Balance Game on Trees
题意:
给一个
数据范围:
分析:
每个节点的颜色无非两种:黑色和白色。我们用
从根节点
black[u] 的状态转移:
对于u 的每一个儿子v ,如果v 的儿子数量大于等于K−1 ,那么如果选择v 的颜色为白色(记此时的答案为son ),可以得到的最优解是:son=white[v][K−1]+1 ,否则v 节点就不能染为白色(因为v 节点的周围不能凑够K 个黑色节点),也就是son=0 。black[u]+=max(black[v],son) white[u][] 的状态转移:
这时对于u 从它的每个儿子v 的状态转移只能v 是黑色或者white[v][K] 。
考虑white[u][i] 的情况,这里需要u 的所有儿子中有i 个是黑色,其余的是白色。如何求这个最优解呢?如果暴力枚举的话,最坏的时间复杂度是:O(2n) !o(╯□╰)o
我们先把所有儿子全是白色的情况相加记为sum :sum=∑white[v][K]
再把每个儿子选择黑色和白色的最优解差值记为diff[] :diff[i]=black[v]−white[v][K]
因为必须有i 个儿子是黑色,那么我们选择的这i 个儿子必然是diff 值最大的前i 个!详情看代码~最坏的时间复杂度是:
O(n2logn∗K) ,实际运行是应远小于这个复杂度。
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>#include <vector>using namespace std;typedef long long ll;const int MAX_N = 110;int T, n, K, sum;int white[MAX_N][15], black[MAX_N], vis[MAX_N], diff[MAX_N];vector<int> vec[MAX_N];void dfs_son(int u, int p){ int size = vec[u].size(); for (int i = 0; i < size; ++i) { int v = vec[u][i]; dfs_son(v, u); } sum = 0; for (int i = 0; i < size; ++i) { int v = vec[u][i]; int son = 0; if (vec[v].size() >= K - 1) son = white[v][K - 1] + 1; black[u] += max(son, black[v]); son = white[v][K]; sum += son; diff[i] = black[v] - son; } sort(diff, diff + size); for (int i = 1; i <= K; ++i) { if (i > size) break; white[u][i] = sum; for (int j = size - 1; j >= size - i; --j) { white[u][i] += diff[j]; } } if (size >= K) white[u][K]++;}int main(){ scanf("%d", &T); while (T--) { scanf("%d%d", &n, &K); for (int i = 1; i <= n; ++i) { vec[i].clear(); } memset(black, 0, sizeof(black)); memset(white, 0, sizeof(white)); getchar(); for (int i = 1, j; i <= n; ++i) { while (1) { scanf("%d", &j); if (j == 0) break; vec[i].push_back(j); if (getchar() == '\n') break; } } dfs_son(1, 0); printf("%d\n", max(black[1], white[1][K])); } return 0;}
0 0
- UVALive 7003 A Balance Game on Trees(树形dp)
- UVALive 7003 A Balance Game on Trees 树形dp
- UVALive 6919 A game for kids(树形dp)
- Perfect Domination on Trees [UVALive 3346] 树形DP
- UVALIVE 3346 Perfect Domination on Trees 树形DP
- UVALive 2038 Strategic game (树形DP,4级)
- UVALive 2038 - Strategic game (经典树形DP)
- 【树形dp】UVALive 2038 Strategic game
- UVALive 2038 Strategic game--树形dp
- UVALive 3683 A Scheduling Problem(树形DP)
- UVALive 3412 Pesky Heroes(树形dp)
- uvalive 5088 hdu3066(树形dp)
- UVALive 4015 树形dp
- 树形DP--HihoCoder1063 Travel On a Tree
- CodeForce 280C Game on Tree -- 树形dp求期望
- Codeforces 280C Game on Tree 树形期望dp
- 简单树形dp uvaLive 4472
- UVALive - 4015 Caves 树形DP
- Java静态内部类
- 使用spring websocket实时读取k8s容器日志输出
- JQuery初始
- 当前日期加20天
- [hdu5492]背包问题的扩展
- UVALive 7003 A Balance Game on Trees(树形dp)
- 双调欧几里得旅行商问题-《算法导论》
- C Tricks(十六)—— 复制字符串
- ajaxfileupload
- Android自定义View(二)画一个表
- ReactiveX/RxJava文档中文版
- 2010年Apache离开JCP的报导
- 四驱概念
- unity判断gameobject是否在摄像机内渲染