POJ 3071 Football(概率DP)

题目链接:http://poj.org/problem?id=3071

题意:2^n个球队比赛,采用淘汰赛。Pij表示i胜j的概率。求n轮之后,哪个队胜出的概率最大?

思路:f[i][j]表示i队在j轮后胜出的概率,f[i][j]=sum(f[i][j-1]*f[k][j-1]*pjk)k为在第j轮i的可能对手。





double f[N][N],p[N][N];

int n;



int main()

{

    Rush(n)

    {

        if(n==-1) break;

        clr(f,0);

        int i,j,k,L,R;

        FOR0(i,(1<<n)) FOR0(j,(1<<n)) RD(p[i][j]);

        FOR0(i,(1<<n)) f[i][0]=1;

        FOR0(i,n) FOR0(j,(1<<n))

        {

            L=(j^(1<<i))>>i<<i;

            R=L+(1<<i)-1;

            FOR(k,L,R) f[j][i+1]+=f[j][i]*f[k][i]*p[j][k];

        }

        int ans=0;

        FOR0(i,(1<<n)) if(f[i][n]>f[ans][n]) ans=i;

        PR(ans+1);

    }

    return 0;

}

  

你可能感兴趣的:(poj)