题意:给出C(M,3)种阵容,和每种阵容间的胜率,你需要连续打败n个阵容。开始时你的阵容任选,打赢之后可以换成对方的阵容,求打败n个阵容的概率。
思路:dp。dp(i,j)表示前当前打第i场,使用第j套阵容的最大胜率。状态转移很简单,要么换阵容,要么不换。
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
double T[222][222];
int ai[10010];
double dp[10010][222];
int n;
int r;
int main(){
int m;
while(cin>>m){
r=m*(m-1)*(m-2)/6;
for(int i=0;i<r;i++){
for(int j=0;j<r;j++){
scanf("%lf",&T[i][j]);
}
}
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&ai[i]);
for(int i=0;i<r;i++)dp[0][i]=1.0;
for(int i=1;i<=n;i++){
for(int j=0;j<r;j++){
dp[i][j]=dp[i-1][j]*T[j][ai[i]];
}
for(int j=0;j<r;j++){
dp[i][ai[i-1]]=max(dp[i][ai[i-1]],dp[i-1][j]*T[ai[i-1]][ai[i]]);
}
}
double ans=0;
for(int i=0;i<r;i++){
ans=max(ans,dp[n][i]);
}
printf("%.6lf\n",ans);
}
return 0;
}