思路:简单的概率DP,题目连转移方向都给你规定好了...见代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double dp[10010][150];
double p[150][150];
int a[15000];
int main()
{
int M;
while(scanf("%d",&M)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
memset(a,0,sizeof(a));
int n = (M-1)*M*(M-2)/6;
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
scanf("%lf",&p[i][j]);
int m;
scanf("%d",&m);
for(int i = 1;i<=m;i++)
scanf("%d",&a[i]);
for(int i = 0;i<=n;i++)
dp[0][i]=1;
for(int i = 1;i<=m;i++)
for(int j = 0;j<n;j++)
{
dp[i][j]=max(dp[i-1][j]*p[j][a[i]],dp[i][j]);
dp[i][a[i]]=max(dp[i-1][j]*p[j][a[i]],dp[i][a[i]]);
}
double ans = 0;
for(int i = 0;i<n;i++)
ans = max(ans,dp[m][i]);
printf("%.6lf\n",ans);
}
}