洛谷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++ ...
随机推荐
- tensorflow图像处理函数(1)
1.tensorflow中对jpeg格式图像的编码/解码函数: import matplotlib.pyplot as plt import tensorflow as tf image_raw_da ...
- 永久禁用Win10驱动程序强制签名
1.在开始按钮点击右键,选择“命令提示符(管理员)” 2.执行以下命令(复制后,在命令提示符中单击鼠标右键即可完成粘贴,然后按回车键执行): bcdedit.exe /set nointegrityc ...
- Eclipse使用maven创建SSM-web项目
1.环境准备 (1)maven:apache-maven-3.5.2,我的maven安装在D:\apache-maven-3.5.2,eclipse中maven配置如下: 先add ,添加好自己的ma ...
- gitHub pull Request记录
1.fork开源项目到自己的gitHub,点fork,然后clone即可 2.提交本地修改,push到自己的代码库 3.点new pull Request,写点备忘信息 注意确保修改的正确性,如果运行 ...
- Python3解leetcode Path Sum III
问题描述: You are given a binary tree in which each node contains an integer value. Find the number of p ...
- 【HDOJ6625】three arrays(Trie树,贪心)
题意:给定两个长均为n的序列a和b,要求两两配对,a[i]和b[j]配对的值为a[i]^b[j],求字典序最小的配对后的值序列 n<=1e5,a[i],b[i]<2^30 思路: 做法一: ...
- C++ 运算符优先级顺序表 (最新/完整)
优先级 运算符 结合律 助记 1 :: 从左至右 作用域 2 a++.a--.type().type{}.a().a[]...-> 从左至右 后缀自增减.函数风格转型.函数调用.下标.成员访问 ...
- HTTP请求时候总是设置的两个参数ConnectionTimeOut和SocketTimeOut
在HTTP请求时候总是设置两个参数,就是连接超时和Socket超时 public static final String SO_TIMEOUT = "http.socket.timeout& ...
- java logger的info记录在哪
这个要看你的日志配置文件是怎么配置的,以log4j为例log4j.appender.mainLog=org.apache.log4j.ConsoleAppenderlog4j.appender.mai ...
- 后端技术杂谈7:OpenStack的基石KVM
Qemu,KVM,Virsh傻傻的分不清 本文转载自Itweet的博客 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://gi ...