• 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
    ",dp(0));
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    2020年12月2日
    2020年12月1日
    2020年11月30日
    2020年11月29日
    2020年11月28日
    2020年11月27日
    2020年11月26日
    2020年11月25日
    浅谈扩展欧几里得算法
    Hello 2020
  • 原文地址:https://www.cnblogs.com/stranger-/p/7705346.html
Copyright © 2020-2023  润新知