HDU 5378 树上的概率DP Leader in Tree Land
官方题解:
可以用求概率的思想来解决这个问题。令以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相关推荐
- HDU 4035 Maze(树形概率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...
- HDU 2955 Robberies(概率DP,01背包)题解
题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...
- HDU 3853 LOOPS(概率DP)
题目链接:点击打开链接 题意:求从(1, 1)点走到(n, m)点的花费能量的期望, 每次决策消耗2点能量. 每次可以原地不动或者向右或者向下, 分别有个概率. 思路:运用全概率期望公式, d[i][ ...
- HDU 4418 高斯消元法求概率DP
把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...
- 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, ...
- HDU 5001 概率DP || 记忆化搜索
2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP 測 ...
- hdu 3853 LOOPS 概率DP
简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...
- HDU - 4035 Maze(概率dp)
题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...
- HDU - 6558/概率dp(从后往前推导)
VJ地址 中文题意: 有一个苦逼程序员小A,他有一个女朋友B,最近看上了一个游戏,他想买这个游戏,可是小A是一个怕老婆的人,每个 月的工资都需要上交,小A找他女朋友商量了好久,最后B同意他用每个月的工 ...
最新文章
- 编程面试中的十个常见错误
- MyBatis 特殊字符处理
- Java基础(三)对象与类
- 46. 全排列/47. 全排列 II
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
- vue 项目配合zepto的巨坑
- NYOJ 3:多边形重心问题
- 重装系统后mac语言怎么改成中文?
- Ventoy+WePE 装机教程(装PVE+ESXI等,不用单独费一个U盘)
- Windows 2000 检测系统安全进阶详解
- 解决win10中无法打开CHM文件的方法
- 20190301小中大
- 图片放大不失真 —— 矢量图
- 分享一款光彩四射的CSS3按钮集合
- 【Nmap】常用命令「一」——活跃主机发现
- Genero BDL 数据类型(1)
- Anaconda Navigator卡logo打不开闪退问题处理方案-更换阿里云镜像源
- 如何获取大量廉价可靠代理IP地址?
- 移动WEB开发之响应式布局--Bootstrap栅格系统
- linux安装geoserver、postgis,发布wms、wmts地图服务