官方题解:

可以用求概率的思想来解决这个问题。令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点。那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]-1)/sz[i]。现在可以求解恰好有k个最大值的概率。

令dp[i][j]表示考虑编号从1到i的点,其中恰好有j个点是其子树最大值的概率。 很容易得到如下转移方程:dp[i][j]=dp[i-1][j]*(sz[i]-1)/sz[i]+dp[i-1][j-1]/sz[i]。这样dp[n][k]就是所有点中恰好有k个最大值的概率。

题目要求的是方案数,用总数n!乘上概率就是答案。计算的时候用逆元代替上面的分数即可

另外我补充一下边界情况:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7
 8 typedef long long LL;
 9
10 const int maxn = 1000 + 10;
11 const LL MOD = 1000000007;
12
13 LL fac[maxn], invfac[maxn], inv[maxn];
14
15 inline LL mul_mod(LL a, LL b) { return (a * b) % MOD; }
16
17 LL pow_mod(LL a, LL n)
18 {
19     LL ans = 1, base = a;
20     while(n)
21     {
22         if(n & 1) ans = mul_mod(ans, base);
23         base = mul_mod(base, base);
24         n >>= 1;
25     }
26     return ans;
27 }
28
29 LL inverse(LL a) { return pow_mod(a, MOD - 2); }
30
31 void preprocess()
32 {
33     fac[0] = 1;
34     for(int i = 1; i < maxn; i++) { inv[i] = inverse(i); fac[i] = (fac[i - 1] * i) % MOD; }
35     invfac[maxn - 1] = inverse(fac[maxn - 1]);
36     for(int i = maxn - 2; i >= 0; i--) invfac[i] = mul_mod(invfac[i+1], (i+1));
37 }
38
39 vector<int> G[maxn];
40
41 int sz[maxn];
42
43 void dfs(int u, int fa)
44 {
45     sz[u] = 1;
46     for(int i = 0; i < G[u].size(); i++)
47     {
48         int v = G[u][i];
49         if(v == fa) continue;
50         dfs(v, u);
51         sz[u] += sz[v];
52     }
53 }
54
55 LL d[maxn][maxn];
56
57 int main()
58 {
59     preprocess();
60
61     int T; scanf("%d", &T);
62     for(int kase = 1; kase <= T; kase++)
63     {
64         int n, k; scanf("%d%d", &n, &k);
65         for(int i = 1; i <= n; i++) G[i].clear();
66         for(int u, v, i = 1; i < n; i++)
67         {
68             scanf("%d%d", &u, &v);
69             G[u].push_back(v); G[v].push_back(u);
70         }
71
72         dfs(1, 0);
73         d[1][0] = mul_mod(sz[1] - 1, inv[sz[1]]);
74         d[1][1] = inv[sz[1]];
75         for(int i = 2; i <= n; i++)
76         {
77             d[i][0] = mul_mod(mul_mod(d[i-1][0], sz[i] - 1), inv[sz[i]]);
78             for(int j = 1; j <= min(i, k); j++)
79             {
80                 LL t1 = mul_mod(mul_mod(d[i-1][j], sz[i] - 1), inv[sz[i]]);
81                 LL t2 = mul_mod(d[i-1][j-1], inv[sz[i]]);
82                 d[i][j] = t1 + t2;
83                 if(d[i][j] >= MOD) d[i][j] -= MOD;
84             }
85         }
86
87         LL ans = mul_mod(d[n][k], fac[n]);
88         printf("Case #%d: %I64d\n", kase, ans);
89     }
90
91     return 0;
92 }

代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4730106.html

HDU 5378 树上的概率DP Leader in Tree Land相关推荐

  1. HDU 4035 Maze(树形概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...

  2. HDU 2955 Robberies(概率DP,01背包)题解

    题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...

  3. HDU 3853 LOOPS(概率DP)

    题目链接:点击打开链接 题意:求从(1, 1)点走到(n, m)点的花费能量的期望, 每次决策消耗2点能量. 每次可以原地不动或者向右或者向下, 分别有个概率. 思路:运用全概率期望公式, d[i][ ...

  4. HDU 4418 高斯消元法求概率DP

    把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...

  5. HDU 1493 QQpet exploratory park(概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1493 题意:一排有61个格子标号0-60.其中停在5,12, 22, 29, 33, 38, 42, ...

  6. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  7. hdu 3853 LOOPS 概率DP

    简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...

  8. HDU - 4035 Maze(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...

  9. HDU - 6558/概率dp(从后往前推导)

    VJ地址 中文题意: 有一个苦逼程序员小A,他有一个女朋友B,最近看上了一个游戏,他想买这个游戏,可是小A是一个怕老婆的人,每个 月的工资都需要上交,小A找他女朋友商量了好久,最后B同意他用每个月的工 ...

最新文章

  1. 编程面试中的十个常见错误
  2. MyBatis 特殊字符处理
  3. Java基础(三)对象与类
  4. 46. 全排列/47. 全排列 II
  5. 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
  6. vue 项目配合zepto的巨坑
  7. NYOJ 3:多边形重心问题
  8. 重装系统后mac语言怎么改成中文?
  9. Ventoy+WePE 装机教程(装PVE+ESXI等,不用单独费一个U盘)
  10. Windows 2000 检测系统安全进阶详解
  11. 解决win10中无法打开CHM文件的方法
  12. 20190301小中大
  13. 图片放大不失真 —— 矢量图
  14. 分享一款光彩四射的CSS3按钮集合
  15. 【Nmap】常用命令「一」——活跃主机发现
  16. Genero BDL 数据类型(1)
  17. Anaconda Navigator卡logo打不开闪退问题处理方案-更换阿里云镜像源
  18. 如何获取大量廉价可靠代理IP地址?
  19. 移动WEB开发之响应式布局--Bootstrap栅格系统
  20. linux安装geoserver、postgis,发布wms、wmts地图服务

热门文章

  1. 冒险岛V79个人用私服搭建回顾
  2. 边云协同的优点_探析云边协同的九大应用场景
  3. php做excel导入word,php如何将excel表格插入到word文档
  4. PHP+ mysql实现注册登录功能
  5. uni-app对接支付
  6. vue 高德地图标记_vue-element-admin 引入高德地图并做海量点标记
  7. PVZ系列六 | 僵尸动画转换
  8. ArcGIS JS API实现地图场景视频融合
  9. python列表转集合_Pandas把dataframe或series转换成list的方法
  10. ios开发面试常见问题及答案