#include<iostream>
#include<stdio.h>
using namespace std;
double dp[8][130];
double p[130][130];
int num[10]={1,2,4,8,16,32,64,128};
int opponent;
int main(){
int n;
while(cin>>n&&n!=-1){
for(int i=0;i<num[n];i++){
for(int j=0;j<num[n];j++){
//cin>>p[i][j];
scanf("%lf",&p[i][j]);
//if(i==j)p[i][j]=1.0;
}
}
for(int i=0;i<num[n];i++)dp[0][i]=1.0;
for(int i=1;i<=n;i++){//compute dp, i is round
int players_in_same_round=num[i-1];
for(int team=0;team<num[n];team++){//每一轮后每一队仍未被淘汰的概率
dp[i][team]=0.0;
opponent=team>>(i-1);
opponent^=1;
opponent=opponent<<(i-1);
//cout<<"round "<<i<<", team "<<team<<" opponent is "<<opponent<<" and fight with team "<<endl;
for(int k=0;k<players_in_same_round;k++){
//cout<<k+opponent<<',';
dp[i][team]+=p[team][k+opponent]*dp[i-1][k+opponent]*dp[i-1][team];
}
//cout<<endl;
}
}
double maxteam=0,maxp=0;
//for(int i=0;i<num[n];i++)cout<<dp[n][i]<<' ';
//cout<<endl;
for(int team=0;team<num[n];team++){
if(maxp<dp[n][team]){maxteam=team;maxp=dp[n][team];}
}
cout<<maxteam+1<<endl;
}
return 0;
}
poj 3071
最新推荐文章于 2021-06-21 22:04:46 发布