Football
题目大意:
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); } }