SRM402
この時期のSRMは問題分が短いのが多い気がする。読みやすいのはいいけど、内容を理解するのに時間がかかってしまう…。
こんかいは2問めが450だったので解けるかと思ったけど、無理だった。div1midはやる気が出ないので、これから250だけを解くことに決めた。
146/250
- 再帰で数える
- 8,7,6,5,4,3,2,1を入力してみると時間オーバー…
- メモ化してみよう
- 答えが合わない…
- メモ化の方法が間違ってたみたい
- Accept
map<int,double> memo; class RandomSort { public: int toint(vector<int> perm){ int ret = 0; REP(i,perm.size()){ ret += perm[i] * pow(9.0,(double)i); } return ret; } double calc(vector<int> &perm,int c){ double count = 0; FOR(i,0,perm.size()){ FOR(j,i+1,perm.size()){ if(perm[i]>perm[j]) count+=1; } } if(count==0) return c; int p_n = toint(perm); if(memo.find(p_n)!=memo.end()) return memo[p_n]+c; double ret = 0; REP(i,perm.size()){ FOR(j,i+1,perm.size()){ if(perm[i]>perm[j]){ swap(perm[i],perm[j]); ret += calc(perm,c+1)/count; swap(perm[i],perm[j]); } } } memo[p_n] = ret-c; return (ret); } double getExpected(vector <int> permutation) { double result = calc(permutation,0); return result; } };