题解 P3830 【[SHOI2012]随机树】
第一问很好处理:设
我们考虑在一个有x-1个叶子节点的树里随机选择一个叶子节点展开,那么树的叶子节点深度总和会增加
所以
第二问就比较难受了:
首先我们知道一个式子:
说人话就是随机变量x的期望为对于所有i,
我们设
转移时枚举左右子树有多少个叶子:
(括号里的式子含义:左右只要一边深度
最后答案即为
代码:
#include<cstdio>
#include<iostream>
using namespace std;
int p,n;
double f[110],dp[110][110],ans;
int main()
{
scanf("%d%d",&p,&n);
if (p==1)
{
f[1]=0;
for (int i=2;i<=n;i++) f[i]=f[i-1]+2.0/i;
printf("%.6f",f[n]);
}
else
{
for (int i=1;i<=n;i++) dp[i][0]=1;
for (int i=2;i<=n;i++)
for (int j=1;j<i;j++)
{
for (int k=1;k<i;k++)
dp[i][j]+=dp[k][j-1]+dp[i-k][j-1]-dp[k][j-1]*dp[i-k][j-1];
dp[i][j]/=(i-1);
}
for (int i=1;i<n;i++) ans+=dp[n][i];
printf("%.6f",ans);
}
}