直接dp即可.
#include <bits/stdc++.h>
using namespace std;
const int N=2e3,M=12;
double f[N][M];//第i个人在第j轮生出的概率.
double F[N][N];//第i名战胜第j名的概率.
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int K=(1<<n);
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
{
int x;scanf("%d",&x);
F[i][j]=(double)x/(double)100;
}
for(int i=1;i<=K;i++)
{
if(i&1) f[i][1]=F[i][i+1];
else f[i][1]=F[i][i-1];
}
for(int i=2;i<=n;i++)
{
int pos=(1<<i);
for(int j=1;j<=K;j++)
{
for(int k=1;k<=K;k++)
{
if((j-1)/pos==(k-1)/pos)
{
if((k-1)/(pos/2)!=(j-1)/(pos/2))
{
f[j][i]+=f[j][i-1]*f[k][i-1]*F[j][k];
}
}
}
}
}printf("%.10f\n",f[m][n]);
return 0;
}
京公网安备 11010502036488号