POJ2096 Collecting Bugs 数学期望 概率DP

题意:

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

Input file contains two integer numbers, n and s (0 < n, s <= 1 000).

定义dp[i][j] 含义: 找到i个bug且属于j个系统的期望值

那么状态转移如下:

dp[i][j] = p1 * (dp[i+1][j+1] + 1) + p2 * (dp[i+1][j] + 1) + p3 * (dp[i][j+1] + 1) + p4 * (dp[i][j]+1);//公式中的+1代表本次的操作,即发现一个bug增加的一天

感觉这个+1不是很好理解  既然是转移到下一天,期望+好像也合情合理

于是可写出dp[i][j]表达式 递推即可

double dp[1005][1005];

int main() {
    double n, s;
    scanf("%lf%lf", &n, &s);
    for (int i = n; i >= 0; i--) {
        for (int j = s; j >= 0; j--) {
            if (i == n && j == s) continue;
            dp[i][j] = n*s + (n - i) * j * dp[i + 1][j] + i * (s - j) * dp[i][j + 1] + (n - i) * (s - j) * dp[i + 1][j + 1];
            dp[i][j] /= (n * s - i * j);
        }
    }
    printf("%.4f", dp[0][0]);
}

猜你喜欢

转载自www.cnblogs.com/hznumqf/p/13195740.html
今日推荐