POJ3071 Football 概率DP 简单

时间:2023-03-08 21:00:21

http://poj.org/problem?id=3071

题意:有2^n个队伍,给出每两个队伍之间的胜率,进行每轮淘汰数为队伍数/2的淘汰赛(每次比赛都是相邻两个队伍进行),问哪只队伍成为冠军概率最大。
很基础。
代码
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
const double eps=1e-;
const int modn=;
int n;
double a[<<][<<]={};
double f[<<][]={};
int main(){
while(scanf("%d",&n)){
if(n==-)return ;
memset(f,,sizeof(f));memset(a,,sizeof(a));
int z=<<n;
for(int i=;i<=z;i++){
for(int j=;j<=z;j++){
scanf("%lf",&a[i][j]);
}
}
for(int i=;i<=z;i++){f[i][]=;}
for(int i=;i<=n;i++){
for(int j=;j<=z;j++){
int t=(j-)/(<<i);
t=t*(<<i); t+=(<<(i-))+;
if(t<=j)t=t-(<<(i-));
int en=t+(<<(i-))-;
for(int w=t;w<=en;w++){
f[j][i]+=a[j][w]*f[w][i-]*f[j][i-];
}
}
}double ans=0.0;int id=;
for(int i=;i<=z;i++){
if(f[i][n]>ans){
ans=f[i][n];
id=i;
}
}printf("%d\n",id);
}
return ;
}