POJ-2151 Check the difficulty of problems---概率DP好题
题目链接:
https://vjudge.net/problem/POJ-2151
题目大意:
ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率
问 每队至少解出一题且冠军队至少解出N道题的概率。
解题思路:
看了题解才恍然大悟,还是做题少没思路。
要求:每队至少解出一题 且 冠军队至少解出N道题的概率
由于冠军队可以不止一队,即允许存在并列冠军
则原来的所求的概率可以转化为:
每队均至少做一题的概率P1 减去 每队做题数均在1到N-1之间的概率P2

注意初始条件,其他递推即可
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = ;
double p[maxn][];//p[i][j]表示第i个队做出第j题的概率
double dp[maxn][][];//dp[i][j][k]表示第i个队前j道题做出k题的概率
double sum[maxn][];//sum[i][j]表示第i个队伍做出至多k题的概率(前缀和)
int main()
{
int n, m, t;
while(cin >> m >> t >> n && m)
{
for(int i = ; i <= t; i++)
{
for(int j = ; j <= m; j++)
cin >> p[i][j];
}
memset(dp, , sizeof(dp));
memset(sum, , sizeof(sum));
for(int i = ; i <= t; i++)
{
dp[i][][] = p[i][];
dp[i][][] = 1.0 - p[i][];
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 i = ; i <= t; i++)
{
sum[i][] = dp[i][m][];
for(int j = ; j <= m; j++)
sum[i][j] = sum[i][j - ] + dp[i][m][j];
}
double p1 = , p2 = ;
//p1表示所有队伍至少做出1题的概率
//p2表示所有队伍做题数目在1-n-1之间
for(int i = ; i <= t; i++)
p1 *= (sum[i][m] - sum[i][]),
p2 *= (sum[i][n - ] - sum[i][]);
printf("%.3f\n", p1 - p2);
}
}
POJ-2151 Check the difficulty of problems---概率DP好题的更多相关文章
- POJ 2151 Check the difficulty of problems 概率dp+01背包
题目链接: http://poj.org/problem?id=2151 Check the difficulty of problems Time Limit: 2000MSMemory Limit ...
- [ACM] POJ 2151 Check the difficulty of problems (概率+DP)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4748 ...
- POJ 2151 Check the difficulty of problems (概率DP)
题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...
- POJ 2151 Check the difficulty of problems (动态规划-可能DP)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4522 ...
- POJ 2151 Check the difficulty of problems
以前做过的题目了....补集+DP Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K ...
- poj 2151 Check the difficulty of problems(概率dp)
poj double 就得交c++,我交G++错了一次 题目:http://poj.org/problem?id=2151 题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 ...
- POJ 2151 Check the difficulty of problems:概率dp【至少】
题目链接:http://poj.org/problem?id=2151 题意: 一次ACM比赛,有t支队伍,比赛共m道题. 第i支队伍做出第j道题的概率为p[i][j]. 问你所有队伍都至少做出一道, ...
- POJ 2151 Check the difficulty of problems (概率dp)
题意:给出m.t.n,接着给出t行m列,表示第i个队伍解决第j题的概率. 现在让你求:每个队伍都至少解出1题,且解出题目最多的队伍至少要解出n道题的概率是多少? 思路:求补集. 即所有队伍都解出题目的 ...
- [POJ2151]Check the difficulty of problems (概率dp)
题目链接:http://poj.org/problem?id=2151 题目大意:有M个题目,T支队伍,第i个队伍做出第j个题目的概率为Pij,问每个队伍都至少做出1个题并且至少有一个队伍做出N题的概 ...
- POJ2157 Check the difficulty of problems 概率DP
http://poj.org/problem?id=2151 题意 :t个队伍m道题,i队写对j题的概率为pij.冠军是解题数超过n的解题数最多的队伍之一,求满足有冠军且其他队伍解题数都大于等于1 ...
随机推荐
- C++二维数组的动态声明
int **a = new int* [m] //分配一个指针数组,将其首地址保存在a中 . for(int i = 0; i < m; i++) //为指针数组的每个元素分配一 ...
- 分治法 - Divide and Conquer
在计算机科学中,分治法是一种很重要的算法.分治法即『分而治之』,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的 ...
- robotframework 常用快捷键
重命名——>F2 执行用例——>F8 创建新工程——>ctrl+n 创建新测试套——>ctrl+shift+f 创建新用例——>ctrl+shift+t 创建新关键字—— ...
- Silverlight 动态创建Enum
private Type CreateEnum() { List<string> lists = new List<string>(); lists.Add("男&q ...
- 为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?
https://baijiahao.baidu.com/s?id=1598811284058671259&wfr=spider&for=pc 简介:CPU缓存是CPU一个重要的组成部分 ...
- jquery.getParams.js
本文参照:http://www.cnblogs.com/cocos/archive/2010/05/14/1735046.html jQuery.extend({ /** * Returns get ...
- maven 如何将自己的jar包添加到本地仓库
1 准备一个需要添加到本地仓库的jar包 我这里准备了一个名为mail.jar 的jar包,放到E:\Install Files目录下面 2 下面演示如何将准备的jar包添加到本地仓库 1 语法 mv ...
- ThreadFactory
在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护 ...
- js的事件冒泡
先来段代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- Java中的内存泄漏分析说明
Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应用程序中还是时有发生的. 下面就解释 ...