题意:给你一个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; }