#include #include using namespace std ; const int MAX = 20 ; int pm[2][MAX][MAX] ; int cprob[MAX] ; int n ; double m ; double cache[1+(1< n) kleft = n - at ; if (cache[hist][kleft] >= 0) return cache[hist][kleft] ; if (at > 0) for (int i=at; i= 0) r = p(2*hist+1, at+1, kleft) ; else { double rn0 = 0, rn1 = 0, ry0 = 0, ry1 = 0 ; rn0 = p(2*hist, at+1, kleft) ; if (kleft > 0) ry0 = p(2*hist, at+1, kleft-1) ; rn1 = p(2*hist+1, at+1, kleft) ; if (kleft > 0) ry1 = p(2*hist+1, at+1, kleft-1) ; double rn = rn0 + (rn1 - rn0) * (1.0 + cprob[at] / m) ; double ry = 0 ; if (ry0 < ry1) ry = ry0 + (ry1 - ry0) * (1.0 - cprob[at] * cprob[at] / (m*m)) ; else ry = ry0 + (ry1 - ry0) * ((m + cprob[at]) * (m + cprob[at]) / (m*m)) ; if (rn > ry) r = rn ; else r = ry ; } if (at > 0) for (int i=at; i> n >> k >> m ; for (int i=0; i> cprob[i] ; for (int j=i+1; j> pm[1][i][j] ; for (int j=i+1; j> pm[0][i][j] ; } for (int i=0; i<=(1<