「专题训练」Collecting Bugs(POJ-2096)

题意与分析

题意大致是这样的:给定一个\(n\times s\)的矩阵,每次可以随机的在这个矩阵内给一个格子染色(染过色的仍然可能被选中),问每一行和每一列都有格子被染色的次数的期望。
这题如果从概率(从正方向推)就会白给,不信你自己试试;而定义反方向的推导(\(e_{i,j}\)意为从i行j列已有染色格子到最后全被染色的次数的期望)就会非常简单:分四种情况讨论即可。

代码

#include <bits/stdc++.h>
using namespace std;

double e[1005][1005];

int n, s;
const double eps = 1e-6;

int main() {
  while (cin >> n >> s) {
    memset(e, 0, sizeof(e));
    for (int x = n; x >= 0; --x) {
      for (int y = s; y >= 0; --y) {
        double p1 = x * y, p2 = (n - x) * y, p3 = x * (s - y),
               p4 = (n - x) * (s - y);
        if (x == n && y == s)
          e[x][y] = 0;
        else {
          e[x][y] = (p2 * e[x + 1][y] + p3 * e[x][y + 1] +
                     p4 * e[x + 1][y + 1] + n * s) /
                    (n * s - p1);
        }
      }
    }
    cout << fixed << setprecision(4) << e[0][0] << endl;
  }
  return 0;
}

转载于:https://www.cnblogs.com/samhx/p/poj-2096.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值