POJ2151Check the difficulty of problems 概率DP
概率DP,还是有点恶心的哈,这道题目真是绕,问你T个队伍。m个题目。每一个队伍做出哪道题的概率都给了。冠军队伍至少也解除n道题目,全部队伍都要出题,问你概率为多少?
一開始感觉是个二维的,然后推啊推啊没有推出来,一開始觉得冠军队伍仅仅能有一个。所以必须控制一个队伍解题数比其他队伍多,并且这个冠军队伍解题数必须大于等于n。大于n的时候其他队伍解题数就非常难了,直到坑到最后才发现 原来能够非常多队伍都是冠军,大家都是十道 那么大家都是冠军。…………
然后还是继续推二维,结果还是没想出。看来不是先如果方程才好做的,先整体来考虑,全部队伍出题概率,就是1 -减去没出题的概率。没出题的概率非常easy的,每一个队伍每道题都做不出 的概率累乘就能够了。那么冠军队伍至少出n道要怎么求呢,想了半天也没想好。后来发现直接 出题的概率 减去 每一个队伍出题数目是在 1到n-1之间的概率累乘。 就能够了,为什么呢?首先每一个队伍都出题这个条件已经满足了,剩下的反过来想。如果每一个队伍出题数都在1到n-1之间那么 就不符合题目要求了。那么减去这部分答案就能够了,这样想就简单点了
后来还是想推二维。发现想不出来,最后推了一个三维的
dp[i][j][k]代表第i仅仅队伍前j道题解出了k道
边界dp[i][0][0] = 1,能够这么理解,前0道题目除了0道题目 这是肯定的 所以概率为1
后来不服。又强行推了一个二维的,如果好方程以后发现 跟三维的意义一样嘛,看来还是要先主要的弄清楚了才干够
先贴个三维的
int m,t,n; double mp[1000 + 55][50 + 55]; double dp[1000 + 55][30 + 5][30 + 5];//dp[i][j][k]第i队前j道题做出k道 void init() {
memset(mp,0.00,sizeof(mp));
memset(dp,0.00,sizeof(dp));
} bool input() {
while(cin>>m>>t>>n,n + m + t) {
for(int i=1;i<=t;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
return false;
}
return true;
} void cal() {
for(int i=1;i<=t;i++) {//边界处理
dp[i][0][0] = 1.00;
for(int j=1;j<=m;j++)
dp[i][j][0] = dp[i][j - 1][0] * (1 - mp[i][j]);
}
for(int i=1;i<=t;i++) {
for(int j=1;j<=m;j++) {
for(int k=1;k<=j;k++)
dp[i][j][k] = dp[i][j - 1][k - 1] * mp[i][j] + dp[i][j - 1][k] * (1 - mp[i][j]);
}
}
double qq = 1.00;
for(int i=1;i<=t;i++)qq *= (1 - dp[i][m][0]);//dp[i][m][0]表示i队一道题都没做出。减去就是出题了
double pp = 1.00;
double tmp = 0.00;
for(int i=1;i<=t;i++) {
tmp = 0.00;
for(int k=1;k<=n - 1;k++)tmp += dp[i][m][k];//i队出了1道,2道……(n - 1)道的概率
pp *= tmp;
}
double ans = qq - pp;
printf("%.3lf\n",ans);
} void output() { } int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}二维的。事实上没什么差别:
int m,t,n;
double mp[1000 + 55][50 + 55];
double dp[30 + 5][30 + 5];//dp[j][k]前j道题做出k道
void init() {
memset(mp,0.00,sizeof(mp));
memset(dp,0.00,sizeof(dp));
}
bool input() {
while(cin>>m>>t>>n,n + m + t) {
for(int i=1;i<=t;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
return false;
}
return true;
}
void cal() {
dp[0][0] = 1.00;
double qq = 1.00;
double pp = 1.00;
for(int i=1;i<=t;i++) {
for(int j=1;j<=m;j++)
dp[j][0] = dp[j - 1][0] * (1 - mp[i][j]);
for(int j=1;j<=m;j++) {
for(int k=1;k<=m;k++) {
dp[j][k] = dp[j - 1][k] * (1 - mp[i][j]) + dp[j - 1][k - 1] * mp[i][j];
}
}
qq *= (1 - dp[m][0]);//当前队伍出题的概率,全部队伍累乘
double tmp = 0.00;
for(int k=1;k<=n - 1;k++)tmp += dp[m][k];//当前队伍出题数目在[1,n)之间的概率
pp *= tmp;//全部队伍要累乘
}
double ans = qq - pp;//减减就是答案
printf("%.3lf\n",ans);
}
void output() {
}
int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}
POJ2151Check 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 个题,解出 ...
- [POJ2151]Check the difficulty of problems (概率dp)
题目链接:http://poj.org/problem?id=2151 题目大意:有M个题目,T支队伍,第i个队伍做出第j个题目的概率为Pij,问每个队伍都至少做出1个题并且至少有一个队伍做出N题的概 ...
- poj 2151Check the difficulty of problems<概率DP>
链接:http://poj.org/problem?id=2151 题意:一场比赛有 T 支队伍,共 M 道题, 给出每支队伍能解出各题的概率~ 求 :冠军至少做出 N 题且每队至少做出一题的概率~ ...
- [poj2151]Check the difficulty of problems概率dp
解题关键:主要就是概率的推导以及至少的转化,至少的转化是需要有前提条件的. 转移方程:$dp[i][j][k] = dp[i][j - 1][k - 1]*p + dp[i][j - 1][k]*(1 ...
- POJ2157 Check the difficulty of problems 概率DP
http://poj.org/problem?id=2151 题意 :t个队伍m道题,i队写对j题的概率为pij.冠军是解题数超过n的解题数最多的队伍之一,求满足有冠军且其他队伍解题数都大于等于1 ...
- POJ2151-Check the difficulty of problems(概率DP)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4512 ...
- poj2151--Check the difficulty of problems(概率dp第四弹,复杂的计算)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5009 ...
随机推荐
- EJB开发第一个无状态会话bean、开发EJBclient
开发第一个无状态会话bean EJB中的三中bean: 会话Bean(Session Bean) 负责与client交互,是编写业务逻辑的地方.在会话bean中能够通过JDBC直接操作数据库.但大多数 ...
- mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法
1. 问题背景 InnoDB是新版MySQL(v5.5及以后)默认的存储引擎,之前版本的默认引擎为MyISAM,因此,低于5.5版本的mysql配置文件.my.cnf中,关于InnoD ...
- linux中文乱码问题及locale详解
一.修改系统默认语言及中文乱码问题记录系统默认使用语言的文件是/etc/sysconfig/i18n,如果默认安装的是中文的系统,i18n的内容如下: LANG="zh_CN.UTF-8&q ...
- CentOS NFS的安装配置、启动及mount挂载方法
一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: NFS的安装配置:centos 5 : yum -y install n ...
- HTML基础总结<头部>
重点摘录:HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 & ...
- DataGrid简单数据绑定实例2
1.Image列显示: 后台绑定: //获取文件夹下的图片 string path = @"K:\Picture\jpg"; private void Button_Click(o ...
- 对于数据操作的SQL语句精粹(长期更新)
--删除空格 Update [Table] Set [Column]=Replace([Column],' ','') --查出左右和右边带空格的数据 select RTRIM( LTRIM([Col ...
- Java Se 基础系列(笔记) -- Exception && Array
Exception 1.java 异常是java提供的用于处理程序中错误(指在程序运行的过程中发生的一些异常事件)的一种机制 2.java程序的执行过程中如果发生异常事件则自动生产一个异常类对象,该对 ...
- Guava API学习之Preconditions优雅的检验参数 编辑
在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做 事前检测和判断,来避免程序流程出错,而不是完全通过错误 ...
- (翻译玩)在使用flask-script的应用上使用gunicorn
在使用flask-script的应用上使用gunicorn 两周前,我强烈的想要学习一点新知识,像新的语言,新的框架之类的!好让我的大脑忙碌起来,寻找了一些日子后,我决定学习现在越来越流行的云应用平台 ...