POJ - 2096 Collecting Bugs【期望DP】

àì夳堔傛蜴生んèń 2023-06-02 13:54 126阅读 0赞

题意:某个系统中有n个子系统和m个bug类型,该系统每天会出现一个bug (属于某个子系统和某个bug类型),bug的类型是等概率的,bug也是等概率地出现在每个子系统的。问所有子系统都出现bug且所有的bug类型都出现的期望天数。

思路:f[i][j] 表示找到i种bug,找到j个子系统的bug,要求期望天数,所以我们从后往前推。

f[i][j] 发现一个bug属于已知的种类和系统概率为 p1 = (i / n) * (j / s)

f[i + 1][j] 发现一个bug未知的种类但属于已知的系统 p2 = ((n - i) / n ) * (j / s)

f[i][j + 1] 发现一个bug未知系统但属于已知的种类 p3 = (i / n) * ((s - j) / s )

f[i + 1][j + 1] 发现一个bug属于未知系统未知种类, p4 = ( (n - i) / n ) * ( (s - j) / s )

那么f[i][j] = p1 * f[i][j] + p2 * f[i + 1][j] + p3 * f[i][j + 1] + p4 *f[i + 1][j + 1] + 1, 加一是因为发现一个bug需要一天的时间

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. #define mid ((l + r) >> 1)
  8. const int maxn = 1e3 + 10;
  9. const ll inf = 0x3f3f3f3f;
  10. double f[maxn][maxn];
  11. int main()
  12. {
  13. int n, s;
  14. scanf("%d%d", &n, &s);
  15. f[0][0] = 0;
  16. for(int i = 0; i <= n; ++i)
  17. {
  18. for(int j = 0; j <= s; ++j)
  19. {
  20. if(i == 0 && j == 0) continue;
  21. double p1 = i * j * 1.0 / n / s;
  22. double p2 = (n - i) * j * 1.0 / n / s;
  23. double p3 = i * (s - j) * 1.0 / n / s;
  24. double p4 = (n - i) * (s - j) * 1.0 / n / s;
  25. f[i][j] = (1 + p2 * f[i + 1][j] + p3 * f[i][j + 1] + p4 * f[i + 1][j + 1]) / (1 - p1);
  26. }
  27. }
  28. printf("%.4f\n", f[0][0]);
  29. return 0;
  30. }

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读

    相关 期望DP入门

    期望DP一般步骤: 1.模拟过程,找出线性性质,作为阶段(这本质上也是线性DP) 2.涉及DP状态 原则: 体现线性性质 体现边权 根据对期望有无贡献来设计状态

    相关 HDU 3853-LOOPS【期望DP

    题意:有一个R\C的迷宫,从(1,1)走到(R,C),每个格子给出停留在原地,向右走一格和向下走一格的概率,且每走一步需要2点能量,求最后所需要的能量期望。 题目链接:[ht

    相关 poj2096 概率dp入门

    题意: 一个系统有s个子系统,一共会产生n中bug。某人一天可以发现一个bug,这个bug属于一个子系统,属于一个种类,每个bug属于某个子系统的概率是1/s,属于某个分类的