POJ 2151 Check the difficulty of problems(概率dp)
来源:互联网 发布:张译 知乎 编辑:程序博客网 时间:2024/05/19 17:08
题目链接:http://poj.org/problem?id=2151
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?
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 20.9 0.91 0.90 0 0
Sample Output
0.972
题意:
比赛中,共 m 道题,t 个队,p[i][j]表示第 i 队解出第 j 题的概率
问:每队至少解出一题且冠军队至少解出 n 道题的概率。
PS:p[i][j]表示第i个队伍做对第j题的概率。dp[i][j][k]表示第i个队伍在前j题中做对了k道的概率。
dp[i][j][k] = dp[i][j-1][k-1]*(p[i][j])+dp[i][j-1][k]*(1-p[i][j]);
再求出每个队都至少做对 1 道题的概率:tt *= 1 - dp[i][m][0];
最后再减去每个队都只做对了 1 ~ n-1 题的概率;
即:(把每个队做对 1 ~ n-1 题的概率相加后,并把每个队的结果相乘);
代码如下:
//PS:p[i][j]表示第i个队伍做对第j题的概率。dp[i][j][k]表示第i个队伍在前j题中做对了k道的概率。////dp[i][j][k] = dp[i][j-1][k-1]*(p[i][j])+dp[i][j-1][k]*(1-p[i][j]);////再求出每个队都至少做对 1 道题的概率:tt *= 1 - dp[i][m][0];////最后再减去每个队都只做对了 1 ~ n-1 题的概率;//即:(把每个队做对 1 ~ n-1 题的概率相加后,并把每个队的结果相乘)#include <cstdio>#include <cstring>double p[1017][47];double dp[1017][47][47];int main(){ int n, m, t; while(~scanf("%d%d%d",&m,&t,&n)) { if(m==0 && t==0 && n==0) break; memset(p, 0,sizeof(p)); memset(dp, 0,sizeof(dp)); for(int i = 0; i < t; i++) { for(int j = 1; j <= m; j++) { scanf("%lf",&p[i][j]); } } for(int i = 0; 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]); 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]); } } } double tt = 1; for(int i = 0; i < t; i++) { tt*=(1 - dp[i][m][0]); } double temp = 1, t_sum; for(int i = 0; i < t; i++) { t_sum = 0; for(int j = 1; j <= n-1; j++) { t_sum+=dp[i][m][j]; } temp *= t_sum; } double ans = tt-temp; printf("%.3lf\n",ans); } return 0;}
1 0
- POJ 2151 Check the difficulty of problems(概率DP)
- POJ 2151 Check the difficulty of problems (概率dp)
- poj 2151 Check the difficulty of problems (概率DP)
- POJ 2151 Check the difficulty of problems(概率dp)
- POJ 2151 Check the difficulty of problems(概率dp)
- poj 2151 Check the difficulty of problems(概率dp)
- POJ 2151 Check the difficulty of problems (概率DP)
- Poj 2151 Check the difficulty of problems (概率DP)
- POJ 2151 Check the difficulty of problems(概率DP)
- poj 2151 Check the difficulty of problems(概率dp)
- POJ 2151 Check the difficulty of problems (概率DP)
- POJ 2151 Check the difficulty of problems(概率DP)
- POJ 2151 Check the difficulty of problems 概率DP
- poj 2151 Check the difficulty of problems 概率dp
- POj 2151 Check the difficulty of problems 概率DP
- 概率dp POJ 2151 Check the difficulty of problems
- poj 2151 Check the difficulty of problems(概率dp)
- poj 2151 Check the difficulty of problems(概率dp)
- 常见的概率分布模型
- 微信营销怎么策划活动 转载
- Python操作MySQL数据库,插入重复数据
- [leetcode] Interleaving String
- 【知乎】能不能用形象的比喻描述一下大数据的技术生态?
- POJ 2151 Check the difficulty of problems(概率dp)
- eclipse中关联源码
- jQuery 1.9不支持$.browser 怎么判断浏览器类型和版本
- mysql Got a packet bigger than 'max_allowed_packet' bytes 错误原因及解决方法
- HDU 2955 Robberies 01背包
- SDUTOJ 2776 小P的故事——神奇的分组 背包
- uniq的简单使用
- 判断二进制数中的1有奇数个还是偶数个
- 调用系统时间dialog(TimePicker),并设置定时提醒功能