概率+dp. 每轮比赛都与上一轮的比赛有关系,所以考虑用dp[i][j]记录编号为j到达i轮的概率。 这道题真无语,调试时候,发现数据会突变,因为这个,这道题前后整了三天!到现在还是不解为何这样! #include<iostream> #include<cstdio> #include<cstring> using namespace std; double date[130][130]; int n; bool vis[130]; int main() { int i,j,k,m; while(cin>>n) { if(n==-1) break; m=(1<<n); for(i=1;i<=m;i++) { for(j=1;j<=m;j++) { scanf("%lf",&date[i][j]); } } double dp[10][130]; memset(dp,0,sizeof(dp)); for(i=1;i<=m;i++) dp[0][i]=1.0; int w; for(i=1;i<=n;i++) { memset(vis,true,sizeof(vis)); int t=(1<<(i-1)); j=1; for(j=1;j<=m;j++) { w=j; while(vis[j]) { for(k=1;k<=t;k++) { int index=k+t+w-1; vis[index]=false; dp[i][j]+=dp[i-1][j]*date[j][index]*dp[i-1][index]; dp[i][index]+=dp[i-1][j]*date[index][j]*dp[i-1][index]; } j++; } } } int flag=0;double max=0; for(i=1;i<=m;i++) { if(max<dp[n][i]) { max=dp[n][i]; flag=i; } } cout<<flag<<endl; } return 0; }