1. 程式人生 > >「專題訓練」Collecting Bugs(POJ-2096)

「專題訓練」Collecting Bugs(POJ-2096)

可能 while 矩陣 代碼 esp 討論 分析 eof ()

題意與分析

題意大致是這樣的:給定一個\(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;
}

「專題訓練」Collecting Bugs(POJ-2096)