传送门
题意
给你2^n个球队,必须相邻的球队才可以比赛!在告诉你i球队战胜j球队的概率,问最后哪支球队赢得概率最大!
分析
我们用 f [ i ] [ j ] f[i][j] f[i][j]表示第 i i i轮比赛之后 j j j赢的概率,画一下图可以得出结论,二进制下,如果 k k k和 j j j在第 i − 1 i - 1 i−1上不相同,往后的位置上都相同,就有可能会遇到
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 110;
double a[N][N];
double f[N][N];
int n;
int main() {
while (scanf("%d", &n) && n != -1) {
int m = n * 2;
memset(f, 0, sizeof f);
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
scanf("%lf", &a[i][j]);
for (int i = 0; i < m; i++) f[0][i] = 1;
for (int i = 1; i <= n; i++)
for (int j = 0; j < m; j++)
for (int k = 0; k < m; k++) {
if ((j >> (i - 1) ^ 1) == (k >> (i - 1)))
f[i][j] += f[i - 1][j] * f[i - 1][k] * a[j][k];
}
int ans = 0;
for(int i = 1;i < m;i++) if(f[n][i] > f[n][ans]) ans = i;
printf("%d\n", ans + 1);
}
return 0;
}