题目链接:http://poj.org/problem?id=2151

题目大意:有M个题目,T支队伍,第i个队伍做出第j个题目的概率为Pij,问每个队伍都至少做出1个题并且至少有一个队伍做出N题的概率。

先定义状态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];

然后设f[i]为前i支队伍里,每队至少做出一个题并且至少有一个队伍做出N题的概率。

那么f[i] = f[i-1]*(第i支队伍做出不少于1题的概率) + (1-f[i-1]-存在队伍没做出题的概率)*(第i支队伍做了不少于N题的概率)

上面这个是个全概率公式

于是乎:

 ///#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <cmath>
#include <numeric>
#include <iterator>
#include <iostream>
#include <cstdlib>
#include <functional>
#include <queue>
#include <stack>
#include <string>
#include <cctype>
using namespace std;
#define PB push_back
#define MP make_pair
#define SZ size()
#define ST begin()
#define ED end()
#define CLR clear()
#define ZERO(x) memset((x),0,sizeof(x))
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const double EPS = 1e-; const int MAX_T = ;
const int MAX_M = ; int M,T,N;
double p[MAX_T][MAX_M],f[MAX_T],any[MAX_T],dp[MAX_T][MAX_M][MAX_M]; int main(){
while( ~scanf("%d%d%d",&M,&T,&N), M!=&&T!=&&N!= ) {
ZERO(dp);
ZERO(f);
ZERO(any);
for(int i=;i<=T;i++) {
for(int j=;j<=M;j++) {
scanf("%lf",&p[i][j]);
}
}
for(int i=;i<=T;i++){
dp[i][][] = 1.0;
for(int j=;j<=M;j++) {
dp[i][j][] = dp[i][j-][]*(-p[i][j]);
}
for(int j=;j<=M;j++){
for(int k=;k<=j;k++){
dp[i][j][k] = dp[i][j-][k]*(-p[i][j]) + dp[i][j-][k-]*p[i][j];
}
}
for(int j=;j<=M;j++){
for(int k=;k<=M;k++){
dp[i][j][k] += dp[i][j][k-];
}
}
} f[] = 0.0;
any[] = 1.0;
for(int i=;i<=T;i++){
any[i] = any[i-]*(1.0-dp[i][M][]);
}
for(int i=;i<=T;i++){
any[i] = 1.0 - any[i];
}
any[] = 0.0; for(int i=;i<=T;i++){
f[i] = f[i-]*(dp[i][M][M]-dp[i][M][]) + (1.0-f[i-]-any[i-])*(dp[i][M][M]-dp[i][M][N-]);
} printf("%.3f\n",f[T]);
}
return ;
}

[POJ2151]Check the difficulty of problems (概率dp)的更多相关文章

  1. [poj2151]Check the difficulty of problems概率dp

    解题关键:主要就是概率的推导以及至少的转化,至少的转化是需要有前提条件的. 转移方程:$dp[i][j][k] = dp[i][j - 1][k - 1]*p + dp[i][j - 1][k]*(1 ...

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

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

  3. [ACM] POJ 2151 Check the difficulty of problems (概率+DP)

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

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

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

  5. POJ2157 Check the difficulty of problems 概率DP

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

  6. POJ2151Check the difficulty of problems 概率DP

    概率DP,还是有点恶心的哈,这道题目真是绕,问你T个队伍.m个题目.每一个队伍做出哪道题的概率都给了.冠军队伍至少也解除n道题目,全部队伍都要出题,问你概率为多少? 一開始感觉是个二维的,然后推啊推啊 ...

  7. POJ-2151 Check the difficulty of problems---概率DP好题

    题目链接: https://vjudge.net/problem/POJ-2151 题目大意: ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 每队至少解出一题且冠军队至少解出N ...

  8. poj 2151Check the difficulty of problems<概率DP>

    链接:http://poj.org/problem?id=2151 题意:一场比赛有 T 支队伍,共 M 道题, 给出每支队伍能解出各题的概率~  求 :冠军至少做出 N 题且每队至少做出一题的概率~ ...

  9. 【POJ】2151:Check the difficulty of problems【概率DP】

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

随机推荐

  1. python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  2. MFC中换行实现

    在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即"\r\n",用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性 ...

  3. 前后台数据交互 后台封装数据 json格式

    namespace ~.sverIterface { public class EventPlayerInfo { public string name { get; set; } public st ...

  4. javax.el.PropertyNotFoundException:

    javax.el.PropertyNotFoundException: Property 'ContextPath' not found on type org.apache.catalina.cor ...

  5. 声明提前js变量

    声明提前问题相关 js的变量声明语句无论出现在何处,都会先与其他代码首先被执行,使用var声明关键词声明变量的 作用于是当前的执行上下文,有可能是外围函数,或者,当变量声明在函数体之外时,则为全局变量 ...

  6. PullToRefreshGridView刷新加载2

    @XStreamAlias("result")public class Myresult { @XStreamImplicit(itemFieldName="item&q ...

  7. 《java编程思想》读书笔记(一)开篇&第五章(1)

    2017 ---新篇章  今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...

  8. 安卓开发学习经历2--《第一行代码》coolweather项目SQL语句同一个“陷阱”掉两次 注意转义字符等特殊字符正确书写 关于Id字段自增加体会

    今天,在运行<第一行代码>coolweather第二阶段代码,又一次报错,还是神奇地与昨天相似,提示,city_id字段不存在,这里我有两种理解,一种是sql语句出错了,另外一种是没有获取 ...

  9. [UI]抽屉菜单DrawerLayout分析(一)

    本文转载于:http://www.cnblogs.com/avenwu/archive/2014/04/16/3669367.html 侧拉菜单作为常见的导航交互控件,最开始在没有没有android官 ...

  10. Pads怎么设置某一网络的线宽

    在利用pads工具进行layout时,由于某一条网络可能会有很多条走线,而走线的宽度也相同,如果一条条设置,会很麻烦,所以pads中可以直接设置某一网络的线宽,避免繁琐的工作. 如下所示同一网络的走线 ...