OJ-Problems-Source/HDOJ/4800_autoAC.cpp

63 lines
1.3 KiB
C++

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 10005
int m,n;
int ai[N];
double dp[200][N],rate[200][200];
bool vis[200][N];
double search(int team,int lo)
{
if(lo>m-1||team<0||team>n)
return 1;
if(vis[team][lo]==true)
return dp[team][lo];
else
{
double t=search(team,lo+1);
if(team!=ai[lo])
{
double t2=search(ai[lo],lo+1);
if(t2>t)
t=t2;
}
vis[team][lo]=true;
dp[team][lo]=rate[team][ai[lo]]*t;
return dp[team][lo];
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
n=n*(n-1)*(n-2);
n/=6;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
{
scanf("%lf",&rate[i][j]);
}
}
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&ai[i]);
memset(vis,false,sizeof(vis));
for(i=0;i<n;i++)
{
dp[i][m-1]=rate[i][ai[m-1]];
vis[i][m-1]=true;
}
double _max=0;
for(i=0;i<n;i++)
{
_max=max(_max,search(i,0));
}
printf("%.6lf\n",_max);
}
return 0;
}