よく分からないからDPする。
memo[ n回スワップした ][ 今の状態 ]
- const int N = 1000 + 1;
- map<string, double> memo[N];
- class BallAndHats {
- public:
- int getHat(string hats, int numSwaps)
- {
- fill(memo, memo + N, map<string, double>());
- memo[0][hats] = 1.0;
- for (int i = 0; i < numSwaps; ++i) {
- FOR (s, memo[i]) {
- string t = s->first;
- double cnt = 0;
- for (int a = 0; a + 1 < t.size(); ++a) {
- if (t[a] == 'o' || t[a + 1] == 'o') ++cnt;
- }
- for (int a = 0; a + 1 < t.size(); ++a) {
- if (t[a] == 'o' || t[a + 1] == 'o') {
- swap(t[a], t[a + 1]);
- memo[i + 1][t] += s->second / cnt;
- swap(t[a], t[a + 1]);
- }
- }
- }
- }
- double mx = 0;
- FOR (i, memo[numSwaps]) {
- mx = max(mx, i->second);
- }
- int mn = 4;
- FOR (i, memo[numSwaps]) {
- if (i->second == mx) {
- mn = min(mn, (int)i->first.find("o"));
- }
- }
- return mn;
- }
- };