Problem:
Reverse Sort

1 ∼ NまでのN個の数字の順列A1, A2, ……, ANが与えられる。
この順列に対して区間[i, j](1 ≤ i ≤ j ≤ N)の数字の順序を逆順にする操作reverse(i, j)を行うことが出来る。
例えば、[1, 2, 3, 4, 5]に対してreverse(2, 4)を適用すると[1, 4, 3, 2, 5]となる。
最小で何回の操作を行えば順列を昇順にソートされた状態にすることが出来るか計算せよ。

Input

入力は以下の形式で与えられる。

N
A1 A2 …… AN

Constraints

Nは整数である

2 ≤ N ≤ 10

Output

問題の解を1行に出力せよ。

Sample Input 1

5
1 4 3 5 2

Output for the Sample Input 1

2

reverse(4,5):1 4 3 2 5

reverse(2,4):1 2 3 4 5

のようにすればよい。

Sample Input 2

5
3 1 5 2 4

Output for the Sample Input 2

4

例えば

reverse(1,2):1 3 5 2 4

reverse(3,5):1 3 4 2 5

reverse(2,4):1 2 4 3 5

reverse(3,4):1 2 3 4 5

のようにすればよい。

Sample Input 3

3
1 2 3

Output for the Sample Input 3

0

Sample Input 4

10
3 1 5 2 7 4 9 6 10 8

Output for the Sample Input 4

9

Solution in C++14 (judge verdict: Time Limit Exceeded)

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <set>
using namespace std;

string rev(const string &s, int i, int j){
  string ret = s;
  for(int k = i; k <= j; ++k) ret[k] = s[j-k+i];
  return ret;
}

int main(){
  int N;
  cin >> N;
  string A(N,'0');
  for(int i = 0; i < N; ++i){
    int t;
    cin >> t;
    A[i] = '0' + t - 1;
  }
  string C(N, '0');
  for(int i = 0; i < N; ++i) C[i] = '0' + i;
  if(A == C){
    cout << 0 << endl;
    return 0;
  }
  queue<string> que;
  //set<string> S, T;
  set<long long> S, T;
  S.insert(stoll(A));
  T.insert(stoll(A));
  for(int i = 0; i < N-1; ++i){
    //set<string> S_;
    set<long long> S_;
    //for(set<string>::iterator itr = S.begin(); itr != S.end(); ++itr){
    for(set<long long>::iterator itr = S.begin(); itr != S.end(); ++itr){
      //string s = *itr;
      string s = to_string(*itr);
      if(s.length() < N) s = '0' + s;
      for(int j = 0; j < N; ++j){
        for(int k = j+1; k < N; ++k){
          string t = rev(s, j, k);
          if(t == C){
            cout << i+1 << endl;
            return 0;
          }
          if(T.find(stoll(t)) == T.end()){
            S_.insert(stoll(t));
            T.insert(stoll(t));
          }
        }
      }
    }
    S = S_;
  }
  cout << N-1 << endl;
  return 0;
}