double dp[55][55][2550]; bool vis[55][55][2550]; int tot; int n, m; inline double getp(int xx, int yy) { return (xx * 1.0) / yy; } double dpf(int x, int y, int z) { if (x > n || y > m || z > tot) return 0; if (x == n && y == m) return 0.0; if (vis[x][y][z]) return dp[x][y][z]; vis[x][y][z] = true; int a = x * y - z; int b = tot - (x * m + y * n - x * y); int xc = x * m - x * y; int yc = y * n - x * y; int sum = a + b + xc + yc; dp[x][y][z] = 0; if (a) dp[x][y][z] += getp(a, sum) * dpf(x, y, z + 1); if (b) dp[x][y][z] += getp(b, sum) * dpf(x + 1, y + 1, z + 1); if (xc) dp[x][y][z] += getp(xc, sum) * dpf(x, y + 1, z + 1); if (yc) dp[x][y][z] += getp(yc, sum) * dpf(x + 1, y, z + 1); dp[x][y][z] += 1.0; return dp[x][y][z]; } int main() { int T; RI(T); while (T--) { RII(n, m); tot = n * m; memset(vis, 0, sizeof(vis)); printf("%.12lf\n", dpf(0, 0, 0)); } return 0; }
原文地址:http://blog.csdn.net/wty__/article/details/40044019