poj 3071 Football

来源:互联网 发布:apache超时时间设置 编辑:程序博客网 时间:2024/06/03 19:15

题目大意:有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;}


0 0
原创粉丝点击