POJ3071 Football 【概率DP】

题目链接
题意:

2 n 2^n 2n只球队进行比赛,比赛方式是
第一轮:1和2,3和4…, 2 n 2^n 2n-1和 2 n 2^n 2n
第二轮:winner(1,2)和winner(3,4)…
.
.
.
显然这样的比赛会进行 n n n轮,给出每只队伍面对其他队伍的胜率,求最后谁的冠军最有可能是谁

题解:

如果把球队编号设为0~ 2 n 2^n 2n-1的话,设 k k k为两只球队x,y二进制不同最高位,即 x & ( 1 < < k ) ! = y & ( 1 < < k ) x\&(1<<k)!=y\&(1<<k) x&(1<<k)!=y&(1<<k),则x,y只可能在第k轮相遇,设 f ( i , k ) f(i,k) f(i,k)为队伍 i i i 在 第 k k k 轮获胜的概率,则 f ( i , k ) = r a t e ( i , j ) ∗ f ( i , k − 1 ) ∗ f ( j , k − 1 )     ( k ∈ [ i + 1 , 2 n − 1 ] ) f(i,k)=rate(i,j)*f(i,k-1)*f(j,k-1)\ \ \ (k\in[i+1,2^n-1]) f(i,k)=rate(i,j)f(i,k1)f(j,k1)   (k[i+1,2n1])

#include<iostream>
#include<sstream>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include <utility>
#include<algorithm>
#include<cstdio>
#include<list>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<time.h>

using namespace std;

#define int long long
#define PI acos(-1.0)
#define eps 1e-9
#define lowbit(a) ((a)&-(a))
 
const int mod = 1e9+7;
int qpow(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return ans;
}
int n;
const int INF = 0x3f3f3f3f;
const int N = 1e6+10;
double rate[1000][1000],f[1000][10];
int solve(int x,int y){
	for(int i=10;i>=0;i--)
        if((y&(1<<i))!=(x&(1<<i)))
            return i;
} 
#define endl '\n'
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	while(cin>>n&&n!=-1){
		memset(f,0,sizeof f);
		int m=(1<<n);
		for(int i=0;i<m;i++)for(int j=0;j<m;j++)cin>>rate[i][j];
		for(int i=0;i<m;i++)f[i][0]=1.0;
		for(int k=0;k<n;k++){
			for(int i=0;i<m;i++){
				for(int j=i+1;j<m;j++){
					int res=solve(i,j);
					if(res!=k)continue;
					f[i][k+1]+=rate[i][j]*f[i][k]*f[j][k];
					f[j][k+1]+=rate[j][i]*f[i][k]*f[j][k];
				}
			}
		}
		double ans=0; int p;
		for(int i=0;i<m;i++)
			if(f[i][n]>ans)ans=f[i][n],p=i;
		cout<<p+1<<endl;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值