版权声明:欢迎转载(标记出处),写得不好还请多指教 https://blog.csdn.net/quan_tum/article/details/82792081
这里来的思路
第一问:
设 表示有 个叶子节点的树的叶子节点平均深度,在一个有 个叶子节点的树里随机选择一个叶子节点展开,树的叶子节点深度总和会增加
第二问:
设
表示有
个叶子,树的深度
的概率,转移时枚举左右子树有多少个叶子:
两边都
的情况要减掉
最后答案为
#include<bits/stdc++.h>
using namespace std;
int p,n;double a[105],f[105][105],ans;
int main(){
scanf("%d%d",&p,&n);
if(p==1){
for(int i=2;i<=n;i++) a[i]=a[i-1]+2.0/i;
return !printf("%.6f",a[n]);
}
for(int i=1;i<=n;++i) f[i][0]=1;
for(int i=2;i<=n;++i)
for(int j=1;j<i;++j){
for(int k=1;k<i;++k) f[i][j]+=f[k][j-1]+f[i-k][j-1]-f[k][j-1]*f[i-k][j-1];
f[i][j]/=(i-1);
}
for(int i=1;i<n;++i) ans+=f[n][i];
return !printf("%.6f",ans);
}