题意:给你一个n,然后给你C(n,3)个队伍, 给你每个队伍之间的胜率。 接下来给你m个队伍,让你依次跟他们比赛,开始你能选择任意的队伍,如果你打赢了一支队伍,你可以选择换成输给你的这个队伍或者不换,你能随便选队伍,求完胜的最大概率(初始队伍让你随便选)。
思路:我们开个二维dp【i】【j】表示赢得前i个队伍后且当前的队伍是j的最大胜率。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
double dp[N][200], ma[200][200];
int main()
{
int n;
while( cin >> n){
int len = n*(n-1)*(n-2)/6;
for(int i = 1; i <= len; i++){
dp[0][i] = 1; //初始化
for(int j = 1; j <= len; j++)
cin >> ma[i][j];
}
cin >> n; double x;
for(int i = 1; i <= n; i++){
int pos; cin >> pos; pos++; x = 0;
for(int j = 1; j <= len; j++){
dp[i][j] = dp[i-1][j] * ma[j][pos];
x = max(x, dp[i][j]);
}
dp[i][pos] = x;
}
printf("%.6lf\n",x);
}
return 0;
}