目录

P3830-[SHOI2012]随机树

P3830-[SHOI2012]随机树

题目:

题目描述:

https://cdn.luogu.com.cn/upload/pic/6555.png

输入格式:

输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数。

输出格式:

输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位。如果 q = 1,则 d 表示叶结点平均深度的数学期望值;如果 q = 2,则 d 表示树深度的数学期望值。

样例:

样例输入 1:

1
1 4

样例输出 1:

1
2.166667

样例输入 2:

1
2 4

样例输出 2:

1
2.666667

样例输入 3:

1
1 12

样例输出 3:

1
4.206421

样例输入 4:

1
2 12

样例输出 4:

1
5.916614

思路:

实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "ybwhead/ios.h"
const int maxn = 2e3 + 10;
double f[maxn][maxn];
int q, n;
int main()
{
    yin >> q >> n;
    if (q == 1)
    {
        double x = 0;
        for (int i = 2; i <= n; i++)
            x = x + (double)2 / i;
        yout << x << endl;
        return 0;
    }
    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];
            // yout << i << " " << j << ' ' << f[i][j] << endl;
            f[i][j] = f[i][j] / (i - 1);
        }
    }
    double ans = 0;
    for (int i = 1; i < n; i++)
        ans += f[n][i];
    yout << ans << endl;
    return 0;
}