Check the difficulty of problems (概率dp求概率)
Check the difficulty of problems
POJ - 2151
大致题意:
m个问题,t个队伍,要求冠军队伍至少解决n个问题,给出每个队伍解决每个问题的概率
求每一个队至少解决一个问题且冠军队伍至少解决n个问题的概率
解题思路:
概率dp求概率问题一般是正推
状态表示:f[i][j][k] 表示第i个队伍在前j个问题中,解决k个问题的概率
-------------p[i][j]表示第i个队伍解决第j个问题的概率
-------------dp[i][k] 表示第i个队伍,解决的问题数小于等于k的概率
分析: 1.初始化 f[i][0][0]=1 ,预处理出f[i][j][0]
--------2.f[i][j][k]有两种转移状态:
----------------在前j-1个问题中,解决k-1个问题 概率:p[i][j]
----------------在前j-1个问题中,解决k个问题 概率:1-p[i][j]
--------得出转移方程: f[i][j][k]= p[i][j]*f[i][j-1][k-1]+(1-p[i][j])*f[i][j-1][k]
--------3.dp[i][k] 表示第i个队伍,解决的问题数小于等于k的概率
--------得出dp[i][k]的转移方程: dp[i][k]=f[i][m][0]+f[i][m][1]+…+f[i][m][k]
--------4.设两个变量 p1,p2 p1表示每个队至少解决一个问题的概率 p2表示每个队解决的问题在1~(n-1)的概率
--------即p1=(1-dp[1][0])*(1-dp[2][0])*…*(1-dp[t][0])
--------p2=(dp[1][n-1]-dp[1][0])*(dp[2][n-1]-dp[2][0])*…*(dp[t][n-1]-dp[t][0])
--------5.根据容斥原理 答案为 p1-p2
补充:因为精度问题,可能G++ WA, C++ AC
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
typedef long long ll;
const int N = 1010;
int n, m, t;
double f[N][50][50]; //表示第i个队伍在前j个问题中,解决k个问题的概率
double p[N][50]; //第i个队伍解决第j个问题的概率
double dp[N][50]; //表示第i个队伍,解决的问题数小于等于k的概率
int main(void)
{while (scanf("%d%d%d", &m, &t, &n), 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) {f[i][0][0] = 1;for (int j = 1; j <= m; ++j)f[i][j][0] = f[i][j - 1][0] * (1 - p[i][j]);for (int j = 1; j <= m; ++j)for (int k = 1; k <= j; ++k)f[i][j][k] = p[i][j] * f[i][j - 1][k - 1] + (1 - p[i][j]) * f[i][j - 1][k];dp[i][0] = f[i][m][0];for (int k = 1; k <= m; ++k)dp[i][k] = dp[i][k - 1] + f[i][m][k];}double p1 = 1, p2 = 1; // p1表示每个队至少解决一个问题 p2表示每个队解决的问题在1-(n-1)for (int i = 1; i <= t; ++i) {p1 *= (1 - dp[i][0]);p2 *= (dp[i][n - 1] - dp[i][0]);}//容斥原理printf("%.3lf\n", p1 - p2);}return 0;
}
Check the difficulty of problems (概率dp求概率)相关推荐
- HDU-4089 Activation (概率DP求概率)
题目大意:一款新游戏注册账号时,有n个用户在排队.每处理一个用户的信息时,可能会出现下面四种情况: 1.处理失败,重新处理,处理信息仍然在队头,发生的概率为p1: 2.处理错误,处理信息到队尾重新排队 ...
- 【POJ - 2151】Check the difficulty of problems(概率dp)
题干: Organizing a programming contest is not an easy job. To avoid making the problems too diffic ...
- Check the difficulty of problems - poj 2151 (概率+DP)
有 T(1<T<=1000) 支队伍和 M(0<M<=30) 个题目,已知每支队伍 i 解决每道题目 j 的的概率 p[i][j],现在问:每支队伍至少解决一道题,且解题最多的 ...
- POJ 2151 Check the difficulty of problems (概率dp)
题意:给出m.t.n,接着给出t行m列,表示第i个队伍解决第j题的概率. 现在让你求:每个队伍都至少解出1题,且解出题目最多的队伍至少要解出n道题的概率是多少? 思路:求补集. 即所有队伍都解出题目的 ...
- POJ-2151 Check the difficulty of problems 概率DP
题目链接:http://poj.org/problem?id=2151 组合数做肯定超时,容易看出是DP.f[i][j]表示某个队的前j个题目做出i个题目的概率,则f[i][j]=f[i][j-1]* ...
- [POJ2151]Check the difficulty of problems(概率DP)
传送门 每个队之间是独立的 f[i][j]表示当前队伍前i个题答对j个的概率 满足条件的概率 == 全部方案(除去答对0)的概率 - 不满足条件的概率(每个队伍答对1~n-1) #include &l ...
- P2473 奖励关 状压概率DP求期望
题目链接 https://www.luogu.com.cn/problem/P2473 题意 n轮,m种球,每轮随即一个球,可以接可以不接,接的话需要满足这个球的前置条件(比如3号球接球必须已经接过1 ...
- poj 2151 Check the difficulty of problems
题意:有m到题,t个队伍,给出第 i 支队作出 第 j 道题的概率 Pij.求每个队至少作出一道题,作出最多的那个队伍至少作出 n 道题的概率. dp[i][j][k]表示第 i 支队前 j 道题作出 ...
- HDU4405(概率DP求期望)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4405 题意:飞行棋,从0到n,置骰子,置到几就往前走几步,前进中会有捷径,比如2和5连到一起了,那你走到2 ...
最新文章
- linux flatpak 简介 同一个应用在不同linux发行版运行
- python怎么获取时间_Python:如何从datetime.timedelta对象中获取时间?
- OSPF——多区域概念及配置、ABR简介、ASBR简介、路由重分发
- 重磅 | 《机器学习综述》算法分类及特征工程手写笔记
- boost/container/small_vector.hpp: No such file or directory on Ubuntu 14.04
- UVA10359 Tiling【大数+递推】
- 应用编辑器保存的htnl代码怎么正常显示在页面上
- kubernetes滚动更新
- 举办了一个如何对外协作的讲座,4人到场
- 移动硬盘提示文件或目录损坏且无法读取怎么办
- 平台型组织——数字化时代的组织智商鉴定器
- flvjs is not defined
- 汽车驱动桥毕业设计【毕业设计(论文) +7张CAD图纸】
- V1.10 Research as a career
- SystemVerilog学习笔记(可综合的部分)(一)
- 网上搜索电子书的办法
- 机器学习笔记 - 加速神经网络训练的 7 个技巧
- Mybatis if test中字符串比较和Mybatis的like查询
- 软件测试需求频繁变更,测试中如何应对需求变更问题
- 2、自写VBA函数2<高德测距>用VB网抓高德地图货车导航距离