题目大意:有2^n个队伍,输入每个队赢其他队伍的概论,求出最可能拿冠军的队伍
#include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
/*
通过二进制可以发现规律,所有高位是一样的,
第i位刚好相反,所以用位运算可以巧妙解决,见代码
*/
using namespace std;
double p[200][200];
double dp[8][200];
int main()
{
int n;
while(cin>>n)
{
if(n==-1)break;
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<(1<<n);j++)
scanf("%lf",&p[i][j]);
}
memset(dp,0,sizeof(dp));
for(int i=0;i<(1<<n);i++)dp[0][i]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<(1<<n);j++)
{
for(int k=0;k<(1<<n);k++)
{
if((j>>(i-1)^1)==(k>>(i-1)))
{
dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k];//全概率dp
}
}
}
double ans=0;
int idx=-1;
for(int i=0;i<(1<<n);i++)
if(dp[n][i]>ans){
ans=dp[n][i];
idx=i+1;
}
printf("%d\n",idx);}
return 0;
}