poj 3071 Football (概率 dp)

链接:poj 3071

题意:有2^n个队,相邻的两两打淘汰赛,n轮后必定会决出冠军,

求最后哪个队夺冠的概率最大

分析:dp[i][j]表示第i轮的时候,第j去支队伍赢的概率

则dp[i][j]的前提就是i-1轮的时候,j是赢的,且第i轮赢了对方

接下来就是找到第i轮的时候,他的可能队手(难点

所有对手的编号为1-2^n,通过二进制可以发现规律,

若第j队和对手k队在第i轮比赛,那么(j-1)和(k-1)二进制第i位刚好相反,

从i+1位开始所有高位是一样的,可以利用位运算判断是否为对手

状态方程为:

dp[i][j]=sigma(dp[i-1][j]*dp[i-1][k]*p[j][k])

#include<stdio.h>
#include<string.h>
int main()
{
    double p[150][150],dp[150][150];
    int n,i,j,k;
    while(scanf("%d",&n)!=EOF){
        if(n==-1)
            break;
        int m=1<<n;
        for(i=1;i<=m;i++)
            for(j=1;j<=m;j++)
                scanf("%lf",&p[i][j]);
        memset(dp,0,sizeof(dp));
        for(i=1;i<=m;i++)
            dp[0][i]=1.0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                for(k=1;k<=m;k++)
                    if(((j-1)>>(i-1)^1)==((k-1)>>(i-1)))  //判断是否为对手
                        dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k];
        double max_p=0;
        int ans=0;
        for(i=1;i<=m;i++)
            if(dp[n][i]>max_p){
                max_p=dp[n][i];
                ans=i;
            }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-08-12 02:12:53

poj 3071 Football (概率 dp)的相关文章

[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

poj 3071 Football (概率DP水题)

G - Football Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. In each round of the tournament, all teams

POJ 3071 Football (概率DP)

题意:给定 2的n次方 个团队对每个队的战胜的概率,一块要打 n 场,每场都是 1 对 2, 2 对 3,每次都取赢的一方,问你最后谁是冠军的概率最大. 析:dp[i][j] 表示 第 i 场 j 胜的概率,每次只要算 i 相邻的且不是已经打过的 2 i-1次方个队,最后再选出概率最大的就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include &l

poj 3071 简单概率dp

题意很清晰,就是问最有可能获得冠军的队伍. 需要注意的是每轮比赛中,每个队都是和自己旁边的一个队比赛,采用淘汰赛制,所以需要决定第i轮的时候j队可以和哪些队比赛,然后求概率dp即可. 状态转移方程: dp[i][j] += dp[i - 1][j] * dp[i - 1][k] * p[j][k]; dp[i][j]表示第i轮j队获胜的概率 = 第i-1轮j队获胜的概率 * 第i-1轮k队获胜的概率 * j队打败k队的概率(之和). 前提是j和k在第i轮可能遇到. 判断方法: ( j >> (

POJ 3071 Football(简单 概率DP)

Football 原文链接:http://blog.csdn.net/xuechelingxiao/article/details/38520105 大意:2^n 个球队进行单场淘汰赛,每两只球队之间比赛会有胜负的概率,问最后谁夺冠的概率最大. 思路:简单的概率DP问题,主要是怎么处理哪两个球队比赛的问题. DP方程为 dp[i][j] = ∑(dp[i-1][j]*dp[i-1][k]*p[j][k]); //dp[i][j]表示第 i 轮的时候,第 j 支队伍赢的概率.. 对于其中位运算,可

POJ 3071 Football (动态规划-概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2768   Accepted: 1412 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

POJ 3071 Football (概率DP)

概率dp的典型题.用dp[j][i]表示第j个队第i场赢的概率.那么这场要赢就必须前一场赢了而且这一场战胜了可能的对手.这些都好想,关键是怎么找出当前要算的队伍的所有可能的竞争对手?这个用异或来算,从队伍编号的二进制表示中可以看出规律来(从二进制和相关运算里找规律也是一个重要的思考角度). #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<s

POJ 3071 Football

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 tournament are placed in a list in order of increasing index. Then, the first team in the l

POJ 3071-Football(概率dp)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3145   Accepted: 1591 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