DP做法:
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
double dp[maxn][maxn],gl[maxn][maxn];
int get_dp(int n)
{
int cnt=0;
int z=n;
while(z=z>>1) cnt++;
memset(dp,0,sizeof(dp));
cout<<"cnt"<<cnt<<endl;
for(int i=0;i<n;i++)
dp[0][i]=1;
for(int i=1;i<=n;i<<=1)
{
int temp=powl(2,i-1);
for(int j=0;j<n;j++)
{
if(j/temp%2)
for(int z=temp*(j/temp-1);z<temp*(j/temp);z++)
{
dp[i][j]+=(dp[i-1][j]*gl[j][z]*dp[i-1][z]);
}
else
for(int z=temp*(j/temp+1);z<temp*(j/temp+2);z++)
dp[i][j]+=(dp[i-1][j]*gl[j][z]*dp[i-1][z]);
}
}
return cnt;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>gl[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<gl[i][j]<<' ';
}
cout<<endl;
}
int cnt=get_dp(n);
cout<<dp[cnt][0]<<endl;
}
}
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
double pro[maxn][maxn]; //pro[i][j]表示i战胜j的概率
double dfs(int x,int l,int r)
{
double ans=0;
if(l+1<r)
{
int m=l+(r-l)/2;
if(x<=m)
{
double p=dfs(x,l,m);
for(int i=m+1;i<=r;i++)
ans+=(p*pro[x][i]*dfs(i,m+1,r));
}
else
{
double p=dfs(x,m+1,r);
for(int i=l;i<=m;i++)
ans+=(p*pro[x][i]*dfs(i,l,m));
}
return ans;
}
else{
return x==l?pro[l][r]:pro[r][l];
}
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>pro[i][j];
}
}
cout<<dfs(0,0,n-1)<<endl;
}
}