数字は多くても 8 個しかないので、とりあえずメモしながら全部試す。
+1.0 する必要があることに全然気がつかなかった。
const int N = 8; int ns[N]; map<string, double> memo; string f(int size) { string s; for (int i = 0; i < (int)size; ++i) { s += ns[i] + 'A'; } return s; } double rec(int size) { string s = f(size); if (memo.count(s)) return memo[s]; double ret = 0; int cnt = 0; for (int i = 0; i < (int)size; ++i) { for (int j = i + 1; j < (int)size; ++j) { if (ns[i] > ns[j]) { swap(ns[i], ns[j]); ret += rec(size); ++cnt; swap(ns[i], ns[j]); } } } if (cnt == 0) return memo[s] = 0; return memo[s] = ret / cnt + 1.0; } class RandomSort { public: double getExpected(vector <int> P) { copy(P.begin(), P.end(), ns); return rec(P.size()); } };