uva 12186 - Another Crisis-树上动态规划
2015-10-03 16:08
519 查看
// uva 12186 - Another Crisis-树上动态规划 /* 典型的树形动态规划问题: 此题题目意思很简单,也很好想到解法,但是就是写程序需要注意。 设d[i]表示以节点i为向上级提交申请需要工人签字的人数。 那么对于节点i,d[i] 是节点i子节点 d[j]集合的最小的前c个值,c为满足直属下属签字率至少为T时签字的人数。 在计算时我们采用了递归的方式。还有就是这提议为啥 不用记忆化搜索呢,因为一个节点最多访问一次,所以没有必要记忆化。 */ #include <iostream> #include <queue> #include <stack> #include <stdio.h> #include <stdlib.h> #include <math.h> #include<vector> #include <string.h> #include <algorithm> #include <set> #include <map> #include <cstdio> #define ll long long using namespace std ; int d[500000 + 10] ; vector<int> son[500000+10] ; int T , n ; int dp(int u ) { if(son[u].size() == 0 ) return 1 ; int len = (int)son[u].size() ; vector<int> temp ;temp.clear() ; for (int i = 0 ; i < len ; i++) { temp.push_back(dp(son[u][i])) ; } sort(temp.begin() , temp.end()) ; int c = (len * T - 1)/100 + 1 ; int ans = 0 ; for (int i = 0; i < c ; i++) { ans += temp[i] ; } return ans ; } int main(int argc, const char * argv[]) { int d ; while(scanf("%d%d" ,&n,&T)==2 &&n+T){ for(int i = 0 ; i < n + 1 ; i++) son[i].clear() ; for (int i = 0; i < n; i++) { scanf("%d" ,&d) ; son[d].push_back(i+1) ; } printf("%d\n" , dp(0)) ; } return 0; }
相关文章推荐
- Bzoj2111:[ZJOI2010]Perm 排列计数:树形动态规划+组合数学
- 结点选择(树形动态规划)
- 洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows
- BZOJ1040 洛谷 P2607 [ZJOI2008]骑士
- 洛谷 P1272 重建道路
- 较难树形动态规划(bzoj 2466 [中山市选2009]树)
- 简单树形动态规划(ural 1039 没有上司的晚会)
- 简单树形动态规划(Ural 1018 Binary Apple Tree)
- 实战—— SSH 端口转发(科普文)
- HDU 5468 Puzzled Elena(容斥原理+dfs)
- JAVA基础--db21_java网络编程&序列化
- 单链表反转
- eclipse luna 无法安装veloeclipse问题
- 机器学习14种常见算法
- 条款25:全特化和偏特化
- mysql 安装
- hdu 3236 二维背包
- Linux Shell学习笔记2:基本的bash shell命令
- ZOJ-3892- Available Computation Sequence
- Android开发之基础-------------Get请求和Post请求