SRM486 div1 medium
どっかでやったことがあるような気がする。
メモ化再帰。
#include <vector> #include <map> using namespace std; class QuickSort { public: map<vector<int>,double> cache; double rec(vector<int> L) { double r; if(L.size()<2) r=0.0; else if(cache.find(L)!=cache.end()) return cache[L]; else { r=0.0; int n=L.size(); for(int i=0;i<n;i++) { vector<int> left,right; for(int j=0;j<n;j++) { if(L[j]<L[i]) { left.push_back(L[j]); if(i<j) r+=1.0/(double)n; } if(L[i]<L[j]) { right.push_back(L[j]); if(j<i) r+=1.0/(double)n; } } r+=(rec(left)+rec(right))/(double)n; } } return cache[L]=r; } double getEval(vector <int> L) { return rec(L); } };