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++ (judge verdict: Time Limit Exceeded)

#include <cstdio>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <stack>
#include <climits>
#include <deque>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
double EPS=1e-10;
double EQ(double a,double b){
    return abs(a-b)<EPS;
}
void fast_stream(){
  std::ios_base::sync_with_stdio(0);
}
template<class T>
string IntToString(T num){
  string res;stringstream ss;ss<<num;
  return ss.str();
}
ll StringToInt(string &str){
  ll res=0;
  for(int i=0;i<(int)str.size();i++)
    res=(res*10+str[i]-'0');
  return res;
}

vector<char> v;
map<vector<char> ,int> d1;
map<vector<char> ,int> d2;
int N;
vector<char> sorted;

int main(){
  cin>>N;
  for(int i=0;i<N;i++){
    int a;
    cin>>a;
    v.push_back(a);
  }
  sorted=v;
  sort(v.begin(),v.end());
  queue<vector<char> > q1,q2;
  d1[v]=0;
  d2[sorted]=0;
  q1.push(v);
  q2.push(sorted);
  int ans=1<<30;
  while(q1.size()||q2.size()){
    {
      vector<char> now=q1.front();q1.pop();
      int ccost=d1[now];
      if(now==sorted){
	cout<<ccost<<endl;
	return 0;
      }
      for(int i=0;i<N;i++){
	for(int j=i+1;j<N;j++){
	  vector<char> nv=now;
	  reverse(nv.begin()+i,nv.begin()+j+1);
	  if(d2.count(nv)!=0&&d1.count(nv)==0)
	    ans=min(ans,ccost+1+d2[nv]);
	  else if(d1.count(nv)==0){
	    d1[nv]=ccost+1;
	    q1.push(nv);
	  }
	}
      }
    }
    {
      vector<char> now=q2.front();q2.pop();
      int ccost=d2[now];
      if(v==now){
	cout<<ccost<<endl;
	return 0;
      }
      for(int i=0;i<N;i++){
	for(int j=i+1;j<N;j++){
	  vector<char> nv=now;
	  reverse(nv.begin()+i,nv.begin()+j+1);
	  if(d1.count(nv)!=0&&d2.count(nv)==0)
	    ans=min(ans,ccost+1+d1[nv]);
	  else if(d2.count(nv)==0){
	    d2[nv]=ccost+1;
	    q2.push(nv);
	  }
	}
      }
    }
    if(q1.size()&&q2.size()){
      int sum=d1[q1.front()]+d2[q2.front()];
      if(sum>=ans)break;
    }
  }
  cout<<ans<<endl;

  return 0;
}