poj 2096 概率dp

一个项目有n个系统,s 种bug,每天,Ivan 可以在一个系统中找出一个bug,求发现 s 种bug并且 n 个系统都有bug的所需天数的期望。

这里每天发现的bug有四种情况,已找到bug的系统的已知bug、未找到bug的系统的已知bug、已找到bug的系统的未知bug、未找到bug的系统的未知bug。

而这几种情况的概率分别是 (i * j) / (n * s)、((n-i) * j) / (n * s) 、(i * (s - j)) / (n * s)、((n-i) * (s - j)) / (n * s);

 

dp[i][j] 表示已经在i个系统中找到j种bug的情况下的期望。

 

dp[i][j] = (i * j) / (n * s) * dp[i][j] + ((n-i) * j) / (n * s) * dp[i+1][j] + (i * (s - j)) / (n * s) * dp[i][j+1] + ((n-i) * (s - j)) / (n * s) * dp[i+1][j+1] + 1;

/***********************************************
 ** problem ID    : poj_2096.cpp
 ** create time    : Sat Jul 25 13:21:58 2015
 ** auther name    : xuelanghu
 ** auther blog    : blog.csdn.net/xuelanghu407
 **********************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n, s;
double dp[1010][1010];

void init() {
    for (int i=0; i<=n; i++) {
        for (int j=0; j<=s; j++) {
            dp[i][j] = -1.0;
        }
    }
}

double DP(int i, int j) {
    if (dp[i][j] != -1.0) return dp[i][j];
    if (i == n && j == s) return dp[i][j] = 0.0;
    
    double res = 1.0;
    if (i+1 <= n && j+1 <= s) 
        res += DP(i+1, j+1) * (n - i) * (s - j) * 1.0 / (n * s);
    if (i+1 <= n) 
        res += DP(i+1, j) * (n-i) * j * 1.0 / (n * s);
    if (j+1 <= s) 
        res += DP(i, j+1) * i * (s - j) * 1.0 / (n * s);
        
    return dp[i][j] = res / (1.0 - (i * j) * 1.0  / (n * s));
}

int main () {
    while (cin >> n >> s) {
        init();
        printf ("%.4lf\n", DP(0, 0));
    }
    return 0;
}
View Code

 

posted @ 2015-07-27 13:25  xuelanghu  阅读(126)  评论(0编辑  收藏  举报