题意:2^n个球队比赛,0和1比,2和3比,以此类推,循环比下去,直至只剩下一个队伍,问那个队伍的冠军的的概率最大 ?
p【i】【j】为i打败j的概率
解析:dp【i】【j】为第i场比赛j胜利的概率 ,则dp【n】【j】的最大值就是答案j
这题的关键是枚举,把球队比赛化成一棵二叉树,每次两个节点比
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std;
#define N 200
int main()
{
int i,k,t,j,n,m,maxnum;
double p[N][N],dp[9][N],maxp;
while(scanf("%d",&n)&&(n!=-1))
{
m=1<<n;
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
scanf("%lf",&p[i][j]);
}
memset(dp,0,sizeof(dp));
for(i=0; i<m; i++)
dp[0][i]=1;
for(i=1; i<=n; i++)
{
for(j=0; j<m; j++)
{
for(k=0;k<m;k++) //还可以化简的、、、、、
{
if((j>>(i-1))==(k>>(i-1)^1))
dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k];
}
}
}
maxp=0;
maxnum=0;
for(j=0; j<m; j++)
{
if(dp[n][j]>maxp)
{
maxp=dp[n][j];
maxnum=j;
}
}
printf("%d\n",maxnum+1);
}
return 0;
}