poj3071--Football(概率计算)

题目链接:点击打开链接

题目大意:给出2^n个队伍,采用淘汰制比赛,第1和第2比赛,第2和第三比赛,淘汰之后,仍然按顺序比赛,p[i][j]:第i支队伍赢第j支队伍的概率,问最终哪个队伍赢的概率最大。

一共会比n场比赛,计算出每一个队伍赢得概率,找出最大值。

第一场 1对2,3对4,,,,

第二场1、2对3、4,5、6对7、8,,,,

第三场1、2、3、4对5、6、7、8,,

这样对于第i个队如果想要在第k场赢,那么他需要在第k-1场赢的概率乘以∑(j在k-1场赢的概率*i对上j赢概率)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std ;
#define eqs 1e-8
double p[200][200] ;
double ans[200][200] ;
int main() {
    int n , m ;
    int i , j , len , k , l , r , mid ;
    double temp ;
    while( scanf("%d", &n) && n != -1 ) {
        m = 1<<n ;
        for(i = 1 ; i <= m ; i++) ans[n][i] = 1.0 ;
        for(i = 1 ; i <= m ; i++)
            for(j = 1 ; j <= m ; j++)
                scanf("%lf", &p[i][j]) ;
        len = 2 ;
        while( n-- ) {
            k = 1 ;
            while( k*len <= m ) {
                l = 1+(k-1)*len ;
                r = k*len ;
                mid = (l+r) / 2 ;
                for(i = l ; i <= r ; i++) {
                    temp = 0.0 ;
                    if( i <= mid ) {
                        for(j = mid+1 ; j <= r ; j++)
                            temp += ans[n+1][j]*p[i][j] ;
                        ans[n][i] = ans[n+1][i]*temp ;
                    }
                    else {
                        for(j = l ; j <= mid ; j++)
                            temp += ans[n+1][j]*p[i][j] ;
                        ans[n][i] = ans[n+1][i]*temp ;
                    }
                }
                k++ ;
            }
            len *= 2 ;
        }
        temp = ans[0][1] ;
        k = 1 ;
        for(i = 2 ; i <= m ; i++) {
            if( ans[0][i]-temp >= eqs ) {
                temp = ans[0][i] ;
                k = i ;
            }
        }
        printf("%d\n", k) ;
    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 21:23:17

poj3071--Football(概率计算)的相关文章

POJ3071(Football)--概率DP

题目在这 题意:有(1<<n个足球队进行比赛,在经过多轮一对一淘汰赛后决出冠军队伍,问最后哪支队伍能够获胜,即输出获胜概率最大的那支队伍编号.给了你n*n的矩阵,用来表示每支队伍间的各自胜率.输入-1为表示结束 en....网上当然也后不少解题报告,但是很多直接给出状态转移方程和贴出代码,而少了其中重要的推断过程,我觉得不是很好.所以自己给写一个较为详细的过程 首先呢,以n==3为例子,即8支队伍参赛.一种比赛情形是这样的 由图可知,在题中给定n后,需要比赛n轮即可知道冠军队伍是谁,我这里多了

[poj3071]football概率dp

题意:n支队伍两两进行比赛,求最有可能获得冠军的队伍. 解题关键:概率dp,转移方程:$dp[i][j] +  = dp[i][j]*dp[i][k]*p[j][k]$表示第$i$回合$j$获胜的概率,原理为全概率公式. 如何判断相邻,通过位运算. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6

poj3071之概率DP

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2667   Accepted: 1361 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

javascript抽奖插件+概率计算

写了一个抽奖的jquery插件和计算概率的方法, 结合起来就是一个简单的概率抽奖, 不过实际项目中基本不会把抽奖概率的计算放在前端处理~. 概率计算 function Probability(conf) { this.probArr = conf || []; this.range = [], this.len = this.probArr.length; if (this.len > 0) { this.init(); } } Probability.prototype = { init: f

条件随机场入门(三) 条件随机场的概率计算问题

条件随机场的概率计算问题是给定条件随机场 P(Y|X) ,输入序列 x 和输出序列 y ,计算条件概率 $P(y_i|x)$ , $P(y_{i-1},y_i|x)$ 以及相应的数学期望的问题.为了方便起见,像 HMM 那样,引进前向-后向向量,递归地计算以上概率及期望值.这样的算法称为前向-后向算法. 前向-后向算法 对每个指标 $i = 0,1,-,n+1$ ,定义前向向量 $a_i(x)$ ,对于起始状态 $i=0$: \[a_0(y|x) = \left \{ \begin{aligne

程序员眼中的统计学(3)】概率计算:把握机会

概率计算:把握机会 作者 白宁超 2015年10月13日23:23:13 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统计和数

HMM的概率计算问题和预测问题的java实现

HMM(hidden markov model)可以用于模式识别,李开复老师就是采用了HMM完成了语音识别. 一下的例子来自于<统计学习方法> 一个HMM由初始概率分布,状态转移概率分布,观测概率分布确定.并且基于两个假设: 1 假设任意时刻t的状态只依赖于前一个时刻的状态,与其他时刻的状态和观测序列无关 2 假设任意时刻的观测只依赖与该市可的马尔科夫的状态,与其他观测,状态无关. 基于此,HMM有三个基本问题: 1 概率计算问题,给定模型和观测序列,计算在模型下的观测序列出现的概率 2 预测

[ACM] POJ 3071 Football (概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2875   Accepted: 1462 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

概率计算函数

//概率计算函数 public function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum

概率计算(抽奖活动、命中率)

最近在做移动端的营销活动,其中包含刮刮卡.大转盘等小游戏,对于用户来说他们不关心Code只关心我是否中奖了,之前也在群里看到有人要概率的"算法"或者说是计算工具类. ps:这里不得不提一下,每当自己在做什么东西的时候总会在一些地方发现相似的需求或者文章,来源有很多比如:cnblogs.QQ群等各种渠道,这不刚刚还有人发表随机数相关的文章,哈哈可能是我运气好. 营销活动核心--我是不是中奖了呢? 是不是中奖都有一个概率和巧合性那么肯定少不了随机数了,说到随机数各位Coder们肯定想到了R