POJ3071 Football
来源:互联网 发布:网络博客无法提现 编辑:程序博客网 时间:2024/04/29 08:28
/*足球比赛。。 想象一颗二叉树。从叶子开始dp直到根节点*/#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;double dp[10][130];//dp[i][j] 第i次比赛 j获胜的概率double map[130][130];int n,t,l,s,bs;int main(){ freopen("test.txt","r",stdin); for(int i=0;i<=129;i++) dp[0][i]=1; while(scanf("%d",&n)&&n!=-1) { t=pow(2,n); for(int i=1;i<=t;i++) { for(int j=1;j<=t;j++) { scanf("%lf",&map[i][j]); } } l=2;//区间长度。 bs=t/2;//区间个数 for(int i=1;i<=n;i++) { for(int j=1;j<=bs;j++) { for(int k=(j-1)*l+1;k<=(j-1)*l+l/2;k++)//左区间 { double td=0; for(int z=(j-1)*l+l/2+1;z<=j*l;z++) { td+=dp[i-1][z]*map[k][z]; } dp[i][k]=dp[i-1][k]*td; } for(int k=(j-1)*l+l/2+1;k<=j*l;k++)//右区间 { double td=0; for(int z=(j-1)*l+1;z<=(j-1)*l+l/2;z++) { td+=dp[i-1][z]*map[k][z]; } dp[i][k]=dp[i-1][k]*td; } } bs/=2; l*=2; } int ans=1; for(int i=2;i<=t;i++) { if(dp[n][ans]<dp[n][i]) ans=i; } printf("%d\n",ans); }}