UVa 12186 树形dp
Posted 灬从此以后灬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 12186 树形dp相关的知识,希望对你有一定的参考价值。
题意 分析 白皮书 P282 例题9-12
AC代码
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <iostream> 6 #include <sstream> 7 #include <algorithm> 8 #include <string> 9 #include <queue> 10 #include <vector> 11 using namespace std; 12 const int maxn= 1e5+10; 13 const int maxm= 1e4+10; 14 const int inf = 0x3f3f3f3f; 15 typedef long long ll; 16 int n,t; 17 vector<int> sons[maxn]; 18 int dp(int a) 19 { 20 if(sons[a].empty()) 21 return 1; 22 int k=sons[a].size(); 23 vector<int> d; 24 for(int i=0; i<k; i++) 25 d.push_back(dp(sons[a][i])); //直接递归下去 26 sort(d.begin(),d.end()); 27 int c=(k*t-1)/100+1; 28 int ans=0; 29 for(int i=0; i<c; i++) 30 ans+=d[i]; 31 return ans; 32 } 33 int main() 34 { 35 while(scanf("%d %d",&n,&t)!=EOF) 36 { 37 if(n==0&&t==0) 38 break; 39 for(int i=0; i<=n; i++) //多组输入 清空vector 注意n也要清空 40 sons[i].clear(); 41 int m; 42 for(int i=1; i<=n; i++) 43 { 44 scanf("%d",&m); //输入第i个点的父节点是m 将i存到m的儿子数组里 45 sons[m].push_back(i); 46 } 47 printf("%d\\n",dp(0)); 48 } 49 return 0; 50 }
以上是关于UVa 12186 树形dp的主要内容,如果未能解决你的问题,请参考以下文章
UVA - 12186 Another Crisis(工人的请愿书)(树形dp)