poj3071 Football

Football

 POJ - 3071 

题目大意:

2^n个队进行足球赛,每个队打败另外一个队都有一个概率。问最后胜利的概率最大的是哪只球队。

/*
    设f[j][i]表示第j支球队通过第i场比赛的概率,则:f[j][i]=sum(f[j][i-1]*f[j+k][i-1]*p[j][j+k]),其中j+k是它这一场可能面对的对手,实际上就是它上一场比赛的第一支队伍加2^(i-1)一直加到2^1 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,n1;
double f[8][200],p[200][200];
int main(){
    while(1){
        scanf("%d",&n);
        if(n==-1)return 0;
        memset(f,0,sizeof(f));
        n1=1<<n;
        for(int i=0;i<n1;i++)
            for(int j=0;j<n1;j++)
                scanf("%lf",&p[i][j]);
        for(int i=0;i<n1;i++)f[0][i]=1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<n1;j++){
                int t=j/(1<<(i-1));
                t^=1;
                f[i][j]=0;
                for(int k=t*(1<<(i-1));k<t*(1<<(i-1))+(1<<(i-1));k++){
                    f[i][j]+=f[i-1][j]*f[i-1][k]*p[j][k];
                }
            }
        }
        int ans;
        double tmp=0;
        for(int i=0;i<n1;i++){
            if(f[n][i]>tmp){
                ans=i+1;
                tmp=f[n][i];
            }
        }
        printf("%d
",ans);
    }
}
原文地址:https://www.cnblogs.com/thmyl/p/7580111.html