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\n",ans+1); } return 0; }