poj2151概率dp

来源:互联网 发布:使用vmware安装linux 编辑:程序博客网 时间:2024/05/16 04:36

题目大意:m道题,t个队伍,n个最少题数,给出t*m的概率,表示队伍做出题的概率。求所有队伍都至少出1题,且至少有一个队伍出n道题以上概率。

参考:点击打开链接


代码:

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 70#define MOD 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define INF 100000000int m , n , t;double dp[35][35];double sum[3];int main(){    double p;    while(scanf("%d %d %d" , &m , &t , &n) != EOF && (m || n || t))    {        double ans1 = 1.0 , ans2 = 1.0;        for(int i = 0 ; i < t ; i ++)        {            dp[0][0] = 1;            for(int j = 1 ; j <= m ; j ++)            {                scanf("%lf" , &p);                for(int k = 0 ; k <= j && k<= m ; k ++)                    dp[k][j] = dp[k][j-1]*(1-p) + (k?dp[k-1][j-1]*p:0);            }            sum[0] = dp[0][m];            sum[1] = 0.0;            for(int j = 1 ; j < n ; j ++) sum[1] += dp[j][m];            ans1 *= (1-sum[0]);            ans2 *= sum[1];        }        printf("%.3lf\n" , ans1 - ans2);    }    return 0;}


0 0
原创粉丝点击