• 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
    ", DP(0, 0));
    	}
    	return 0;
    }
    


  • 相关阅读:
    tp5 入口文件访问优化
    tp5 方法控制器的调用
    PT5目录框架1
    0621JQuery函数事件
    0621 JQuery弹窗
    0621 JQuery三级联动
    PHP基础重点---高级查询0604
    SQL练习0603
    PHP重点3---表中简单查询、增删改
    wamp中MySQL控制台的基本操作
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7066351.html
Copyright © 2020-2023  润新知