Check the difficulty of problems
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 4748   Accepted: 2078

Description

Organizing a programming contest is not an easy job. To avoid making the problems too difficult, the organizer usually expect the contest result satisfy the following two terms: 

1. All of the teams solve at least one problem. 

2. The champion (One of those teams that solve the most problems) solves at least a certain number of problems. 



Now the organizer has studied out the contest problems, and through the result of preliminary contest, the organizer can estimate the probability that a certain team can successfully solve a certain problem. 



Given the number of contest problems M, the number of teams T, and the number of problems N that the organizer expect the champion solve at least. We also assume that team i solves problem j with the probability Pij (1 <= i <= T, 1<= j <= M). Well, can you
calculate the probability that all of the teams solve at least one problem, and at the same time the champion team solves at least N problems? 

Input

The input consists of several test cases. The first line of each test case contains three integers M (0 < M <= 30), T (1 < T <= 1000) and N (0 < N <= M). Each of the following T lines contains M floating-point numbers in the range of [0,1]. In these T lines,
the j-th number in the i-th line is just Pij. A test case of M = T = N = 0 indicates the end of input, and should not be processed.

Output

For each test case, please output the answer in a separate line. The result should be rounded to three digits after the decimal point.

Sample Input

2 2 2
0.9 0.9
1 0.9
0 0 0

Sample Output

0.972

Source

POJ Monthly,鲁小石

解题思路:

这道题太无语了...特别不好理解...... 概率,概率,概率......

题意为 有T个队參加ACM比赛。一共同拥有M道题,问全部的队都至少做出一道题且冠军队做出的题目不能少于N道的概率。

dp[1010][32][32];//dp[i][j][k]表示第i个队前j道题中做出k道

p[1010][32];//p[i][j] 表示第i个队做出第j道题的概率

s[1010][32];//s[i][j]表示第i各队做出的题目小于等于j道的概率

转载于:http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html

设dp[i][j][k]表示第i个队在前j道题中解出k道的概率

则:

dp[i][j][k]=dp[i][j-1][k-1]*p[j][k]+dp[i][j-1][k]*(1-p[j][k]);

先初始化算出dp[i][0][0]和dp[i][j][0];

设s[i][k]表示第i队做出的题小于等于k的概率

则s[i][k]=dp[i][M][0]+dp[i][M][1]+``````+dp[i][M][k];





则每一个队至少做出一道题概率为P1=(1-s[1][0])*(1-s[2][0])*```(1-s[T][0]);

每一个队做出的题数都在1~N-1的概率为P2=(s[1][N-1]-s[1][0])*(s[2][N-1]-s[2][0])*```(s[T][N-1]-s[T][0]);





最后的答案就是P1-P2

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
double dp[1010][32][32];//dp[i][j][k]表示第i个队前j道题中做出k道
double p[1010][32];//p[i][j] 表示第i个队做出第j道题的概率
double s[1010][32];//s[i][j]表示第i各队做出的题目小于等于j道的概率
int m,n,t; int main()
{
while(scanf("%d%d%d",&m,&t,&n)!=EOF&&(m||t||n))
{
for(int i=1;i<=t;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&p[i][j]); for(int i=1;i<=t;i++)
{
dp[i][0][0]=1;
for(int j=1;j<=m;j++)
dp[i][j][0]=dp[i][j-1][0]*(1-p[i][j]);//第i个队前j道题目都做不出来的概率 for(int j=1;j<=m;j++)
for(int k=1;k<=j;k++)
dp[i][j][k]=dp[i][j-1][k-1]*p[i][j]+dp[i][j-1][k]*(1-p[i][j]);
//第i个队前j道题做出k道的概率等于前j-1道题做出k-1道,第j道做出来加上前j-1道做出k道,第j道没做出来的概率和 s[i][0]=dp[i][m][0];
for(int j=1;j<=m;j++)
s[i][j]=s[i][j-1]+dp[i][m][j];//依据上面的s数组求法可得递推公式
}
double p1=1,p2=1;
for(int i=1;i<=t;i++)
{
p1*=(1-s[i][0]);//全部的队至少做出一题的概率
p2*=(s[i][n-1]-s[i][0]);//全部的队都做出来1到n-1道题
}
printf("%.3lf\n",p1-p2);
}
return 0;
}

[ACM] POJ 2151 Check the difficulty of problems (概率+DP)的更多相关文章

  1. POJ 2151 Check the difficulty of problems 概率dp+01背包

    题目链接: http://poj.org/problem?id=2151 Check the difficulty of problems Time Limit: 2000MSMemory Limit ...

  2. POJ 2151 Check the difficulty of problems (概率DP)

    题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...

  3. POJ 2151 Check the difficulty of problems

    以前做过的题目了....补集+DP        Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K ...

  4. POJ 2151 Check the difficulty of problems (动态规划-可能DP)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4522   ...

  5. poj 2151 Check the difficulty of problems(概率dp)

    poj double 就得交c++,我交G++错了一次 题目:http://poj.org/problem?id=2151 题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 ...

  6. POJ 2151 Check the difficulty of problems:概率dp【至少】

    题目链接:http://poj.org/problem?id=2151 题意: 一次ACM比赛,有t支队伍,比赛共m道题. 第i支队伍做出第j道题的概率为p[i][j]. 问你所有队伍都至少做出一道, ...

  7. POJ 2151 Check the difficulty of problems (概率dp)

    题意:给出m.t.n,接着给出t行m列,表示第i个队伍解决第j题的概率. 现在让你求:每个队伍都至少解出1题,且解出题目最多的队伍至少要解出n道题的概率是多少? 思路:求补集. 即所有队伍都解出题目的 ...

  8. [POJ2151]Check the difficulty of problems (概率dp)

    题目链接:http://poj.org/problem?id=2151 题目大意:有M个题目,T支队伍,第i个队伍做出第j个题目的概率为Pij,问每个队伍都至少做出1个题并且至少有一个队伍做出N题的概 ...

  9. POJ2157 Check the difficulty of problems 概率DP

    http://poj.org/problem?id=2151   题意 :t个队伍m道题,i队写对j题的概率为pij.冠军是解题数超过n的解题数最多的队伍之一,求满足有冠军且其他队伍解题数都大于等于1 ...

随机推荐

  1. Java==与equals方法的区别

    摘自:http://www.cnblogs.com/dolphin0520/p/3592500.html 1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等: 如果作用于引 ...

  2. php必备树状数组处理方法

    thinkphp必备公共方法 /** * 子元素计数器 * @param array $array * @param int $pid * @return array */ function arra ...

  3. 针对“永恒之蓝”攻击紧急处置手册(蠕虫 WannaCry)

    首先确认主机是否被感染 被感染的机器屏幕会显示如下的告知付赎金的界面: 如果主机已被感染: 则将该主机隔离或断网(拔网线).若客户存在该主机备份,则启动备份恢复程序. 如果主机未被感染: 则存在四种方 ...

  4. 胖AP与瘦AP区别

    一.胖AP组网方案 1.漫游问题 用户从一个胖AP的覆盖区域走到另一个胖AP的覆盖区域,会重新连接信号强的一个胖AP,重新进行认证,重新获取IP地址,存在断网现象: 2.无法保证WLAN的安全性 为了 ...

  5. 清理tomcat缓存

    解决方案:删除work目录的内容,注意不能删除work目录,不然会出现404错误 rm -rf /usr/local/tomcat/work/*

  6. saturate_cast防越界函数

    CV_IMAGE_ELEM(img2,uchar,i,j*3+c)=saturate_cast<uchar>(alpha*( CV_IMAGE_ELEM(img,uchar,i,j*3+c ...

  7. HDU 1013 Digital Roots(字符串,大数,九余数定理)

    Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. 洛谷——P1655 小朋友的球

    P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝 ...

  9. 闪迪U3利用工具U3-Pwn

    闪迪U3利用工具U3-Pwn   闪迪U3是闪迪公司为Sandisk Cruzer系列U盘提供的一个功能.该模块支持数据加密和CD启动功能.U3-Pwn就是针对U3的一个利用工具.渗透测试人员可以通过 ...

  10. luogu P3368 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...