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);    }}

原创粉丝点击