SGU 495-Kids and Prizes【期望DP】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41785863/article/details/102567888

题意:

有n个奖品,m个人排队来选礼物,对于每个人,他打开的盒子,可能有礼物,也有可能已经被之前的人取走了,然后把盒子放回原处。求最后m个人取走礼物的期望总数。

多组数据
保留9为小数

思路:f[i] 表示第i个人取走礼物的期望总数,那么对于f[i] 来说, 它有f[i - 1] / n 的概率取到一个空的,1 - f[i - 1] / n 的概率取到一个礼物,那么转移方程就是f[i] = f[i - 1] / n * f[i - 1] + (n - f[i - 1] ) / n * (f[i - 1] + 1), 由于求得是期望,所以我们初始f[m] = 0, 目标状态是f[0].

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 +10;
double f[maxn];

int main()
{
    int n, m;
    while(~scanf("%d%d", &n, &m))
    {
        for(int i = 0; i <= m + 2; ++i) f[i] = 0;
        f[m] = 0;
        for(int i = m - 1; i >= 0; --i)
        {
            f[i] = ((double)n - f[i + 1]) / n * (f[i + 1] + 1) + f[i + 1] / n * f[i + 1];
        }
        printf("%.10f\n", f[0]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41785863/article/details/102567888
sgu