链接:点击打开链接
题意:给出2^n个球队间胜负概率,两两相邻进行比赛,求最后哪个队获得冠军概率大
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
double f[205][205],dp[10][205];
int main(){
int n,i,j,k,id;
double ans;
while(scanf("%d",&n)!=EOF){ //dp[i][j]表示进行i轮,j获得冠军的概率
if(n==-1)
break;
for(i=0;i<(1<<n);i++)
for(j=0;j<(1<<n);j++)
scanf("%lf",&f[i][j]);
for(i=0;i<=n;i++)
for(j=0;j<(1<<n);j++)
dp[i][j]=0;
for(i=0;i<(1<<n);i++)
dp[0][i]=1;
for(i=1;i<=n;i++){
for(j=0;j<(1<<n);j++){
for(k=0;k<(1<<n);k++){ //关键就在与第i轮哪两个球队间可以进行比赛
if(((j>>(i-1))^1)==(k>>(i-1)))
dp[i][j]+=dp[i-1][j]*dp[i-1][k]*f[j][k];
}
}
}
id=ans=0;
for(i=0;i<(1<<n);i++){
if(ans<dp[n][i]){
id=i+1;
ans=dp[n][i];
}
}
printf("%d\n",id);
}
return 0;
}