1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<bits/stdc++.h> using namespace std;
#define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i) #define drep(i,a,b) for(int i=a,i##end=b;i>=i##end;--i) template <class T> inline void cmin(T &a,T b){ ((a>b)&&(a=b)); } template <class T> inline void cmax(T &a,T b){ ((a<b)&&(a=b)); }
class RockPaperScissors { private: static const int N=53; static const int eps=1e-9; double F[N][N][N][4],G[N][N][N][4],w[3]; double C[N][N];
public: double bestScore(vector <int> w1, vector <int> w2, vector <int> w3) { int n=w1.size(); rep(i,0,n) rep(j,C[i][0]=1,i) C[i][j]=C[i-1][j-1]+C[i-1][j]; memset(F,0,sizeof F),F[0][0][0][3]=1; rep(i,1,n) { w[0]=w1[i-1]/300.0; w[1]=w2[i-1]/300.0; w[2]=w3[i-1]/300.0; rep(a,0,i) rep(b,0,i-a) rep(c,0,i-a-b) rep(d,0,3) G[a][b][c][d]=F[a][b][c][d]; rep(a,0,i) rep(b,0,i-a) rep(c,0,i-a-b) rep(d,0,3) if(G[a][b][c][d]>eps) { F[a+1][b][c][d]+=G[a][b][c][d]*w[0]; F[a][b+1][c][d]+=G[a][b][c][d]*w[1]; F[a][b][c+1][d]+=G[a][b][c][d]*w[2]; if(d==3) rep(e,0,2) F[a][b][c][e]+=G[a][b][c][d]*w[e]; } } double ans=0; rep(a,0,n-1) rep(b,0,n-1-a) rep(c,0,n-1-a-b) { double ma=0; rep(d,0,2) cmax(ma,F[a][b][c][d]+F[a][b][c][(d+2)%3]*3); ans+=ma/C[n][a+b+c]/(n-a-b-c); } return ans; } };
|