洛谷P3830 随机树(SHOI2012)概率期望DP
题意:中文题,按照题目要求的二叉树生成方式,问(1)叶平均深度 (2)树平均深度
解法:这道题看完题之后完全没头绪,无奈看题解果然不是我能想到的qwq。题解参考https://blog.csdn.net/Maxwei_wzj/article/details/82262755这位大佬的,这里讲下我的理解:
首先是第一问:第一问会简单一些,设f[i]代表叶节点为i的树的叶平均深度,那么因为是平均那么 i*f[i] 就是叶子总深度啦。在叶子深度x下拓展得到的新贡献是 2(x+1)-x=x+2 。那么就有 i*f[i]=(i-1)*f[i-1]+x+2 。这里的x是什么呢?x是叶子深度当然要是期望情况下的深度,那不就恰好是f[i]吗!!
那么得到 i*f[i]=(i-1)*f[i-1]+f[i-1]+2 化简得到 f[i]=f[i-1]+2/n 。第一问解决。
第二问思维难度会更大一些:令g[i][j]代表叶子数为i的树深度大于等于j的概率。
那么会得到状态转移方程: g[i][j]=1/(i-1) * sigma(g[k][j-1]+g[i-k][j-1]) (k=1~i-1);
解释一下就是把i个叶子分给左右子树(当然左右都至少有一个叶子所以才是i-1种情况),然后加上根节点的深度要求左边的概率就是g[k][j-1],右边的概率就是g[i-k][j-1]。但是这样会加多了(因为g[i][j]是没有区分左右的所以直接加,左右都满足条件的会加了两次),所以要减去相乘的结果。
至于这个方程最重要的一点是为什么结果能除以i-1?这个结论需要证明,建议看上面大佬或者洛谷大佬的题解证明过程。结论就是:

代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=+;
int q,n; double dp1[N]; //dp1[i]代表:i个结点的平均深度期望为dp1[i]
void solve1() {
dp1[]=;
for (int i=;i<=n;i++) dp1[i]=dp1[i-]+/(double)i;
printf("%.6lf\n",dp1[n]);
} double dp2[N][N]; //dp2[i][j]代表:i个结点树深度大于等于j的概率
void solve2() {
dp2[][]=;
for (int i=;i<=n;i++) {
dp2[i][]=;
for (int j=;j<=n;j++) {
for (int k=;k<i;k++)
dp2[i][j]+=dp2[k][j-]+dp2[i-k][j-]-dp2[k][j-]*dp2[i-k][j-];
dp2[i][j]/=(double)(i-);
}
}
double ans=;
for (int i=;i<n;i++) ans+=(dp2[n][i]-dp2[n][i+])*i;
printf("%.6lf\n",ans);
} int main()
{
cin>>q>>n;
if (q==) solve1();
else solve2();
return ;
}
洛谷P3830 随机树(SHOI2012)概率期望DP的更多相关文章
- 洛谷P5437/5442 约定(概率期望,拉格朗日插值,自然数幂)
题目大意:$n$ 个点的完全图,点 $i$ 和点 $j$ 的边权为 $(i+j)^k$.随机一个生成树,问这个生成树边权和的期望对 $998244353$ 取模的值. 对于P5437:$1\le n\ ...
- 洛谷P4550 收集邮票(概率期望)
传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...
- 洛谷P3239 [HNOI2015]亚瑟王(期望dp)
传送门 stdcall大佬好强 期望的姿势不是很高……据大佬说期望有一个线性性质,也就是说可以把每一张牌的期望伤害算出来然后再加起来就是总的期望伤害 因为每一张牌只能用一次,我们设$dp[i]$表示第 ...
- 洛谷 P3239 [HNOI2015]亚瑟王(期望+dp)
题面传送门 感觉是道挺好的题,可惜当时没写题解来着的? 根据期望的线性公式,我们求出每个卡牌被发动的概率 \(q_i\),然后 \[ans=\sum\limits_{i=1}^np_id_i \] 于 ...
- 洛谷 P5249 - [LnOI2019]加特林轮盘赌(期望 dp+高斯消元)
题面传送门 期望真 nm 有意思,所以蒟蒻又来颓期望辣 先特判掉 \(P_0=0\) 的情况,下面假设 \(P_0\ne 0\). 首先注意到我们每次将加特林对准一个人,如果这个人被毙掉了,那么相当于 ...
- 洛谷P1365 WJMZBMR打osu! / Easy——期望DP
题目:https://www.luogu.org/problemnew/show/P1365 平方和怎样递推? 其实就是 (x+1)^2 = x^2 + 2*x + 1: 所以我们要关注这里的 x — ...
- LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】
LINK 思路 首先在加入几个点之后所有的点都只有三种状态 一个是在独立集中,一个是和独立集联通,还有一个是没有被访问过 然后前两个状态是可以压缩起来的 因为我们只需要记录下当前独立集大小和是否被访问 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷P3018 [USACO11MAR]树装饰Tree Decoration
洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...
随机推荐
- Eclipse 4.9 创建springboot项目步骤
上一篇文章写了eclipse安装STS. 现在创建Spring Starter Project 具体步骤如下: 1.等你安装好STS后,就在Eclipse > File >New 选择 ...
- java.nio.channels.IllegalBlockingModeException
报错信息如下: Exception in thread "main" java.nio.channels.IllegalBlockingModeException at java. ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)收集解决参数嗅探问题的信息
---从计划缓存中直接获取查询计划和参数: ), ) SELECT @dbname = 'hydee_连锁', @procname = 'dbo.p_select_ware'; WITH baseda ...
- FastDFS整合SpringBoot(五)
pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- Android签名机制之---签名验证过程详解
一.前言 今天是元旦,也是Single Dog的嚎叫之日,只能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是如何验证一个Apk的签名.在前一篇文章中我们 ...
- videojs实践--兼容ie7,8
1,还是先上图 ie9+,ff,chrome,,,
- womenzijide_jiafenxiang
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- Bing Advanced Search Tricks You Should Know
Bing is one of the world's most popular search engines that has gained many fans with its ease of us ...
- scrapy-redis源码浅析
原文链接 前言 分析这个项目的源码原因是需要有去重过滤,增量爬取两个功能,而scrapy-redis项目已经帮我们实现了,想看看他是怎么实现的.这里只贴出部分主要代码,查看时请打开源码对照,笔记有点长 ...
- linux使用apache发布静态html网页
环境 centOS7+httpd 安装httpd 安装 #检查是否安装和httpd rpm -qa | grep httpd #如果没安装 yum -y install httpd 启动httpd并验 ...