poj 3071 Football

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

2^n 支足球队比赛,共比n场,第一场1号与2号比,3号与4号比……

每场胜出者进入下一场,输者淘汰

每一场都是相邻的两个队伍比拼

已知任意两个队伍比拼获胜的概率

求最后哪只队伍获胜的概率最大

dp[i][j] 到第i场比赛j获胜的概率

枚举本场j和k比,dp[i][j]= Σ dp[i-1][j]*dp[i-1][k]*p[j][k]

#include<cstdio>

using namespace std;

const int N=7;
const int M=(1<<N)+1;

double dp[N+1][M+1],p[M+1][M+1];

int main()
{
    int n,m,t,h,ans;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==-1) return 0;
        m=1<<n;
        for(int i=0;i<m;++i) 
            for(int j=0;j<m;++j)
                scanf("%lf",&p[i][j]);
        for(int i=0;i<m;++i) dp[0][i]=1;
        for(int i=1;i<=n;++i)
            for(int j=0;j<m;++j)
            {
                t=j/(1<<i-1);
                t^=1;
                dp[i][j]=0;
                h=t*(1<<i-1)+(1<<i-1);
                for(int k=t*(1<<i-1);k<h;++k) dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k];
            }
        ans=0;
        for(int i=0;i<m;++i) ans=dp[n][i]>dp[n][ans] ? i : ans;
        printf("%d
",ans+1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8598886.html