2014년 8월 26일 화요일

SORTGAME

AOJ SORTGAME

SOL)

정렬된 순열에서 주어진 순열을 만드는 최소비용과
주어진 순열에서 정렬도딘 순열을 만드는 최소비용은 같다.
이를 이용하여 정렬된 순열에서 BFS를 이용하여 정렬이 되지 않은 순열의 비용 테이블을 만든다.


*BFS 미리 전처리를 해주어야 시간초과가 나지 않는다.


[-] Collapse
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
map<vector<int>, int> info;
void precal(vector<int> arr){
    info[arr] = 0;
    queue<vector<int>> mq; mq.push(arr);
    while (!mq.empty()){
        vector<int> mv = mq.front();
        int cost = info[mv];
        mq.pop();
        for (int i = 0; i < arr.size(); i++) {
            for (int j = i + 2; j <= arr.size(); j++){
                reverse(mv.begin() + i, mv.begin() + j);
                if (info.count(mv) == 0){
                    mq.push(mv);
                    info[mv] = cost + 1;
                }
                reverse(mv.begin() + i, mv.begin() + j);
            }
        }
    }
    return;
}
void make(){
    for (int i = 1; i <= 8; i++){
        vector<int> pre(i);
        for (int j = 0; j < i; j++)
            pre[j] = j + 1;
        precal(pre);
    }
}
int main(){
    int t; scanf("%d", &t);
    make();
    while (t--){
        int n; scanf("%d", &n);
        vector<int> mv(n), sorted(n);
        for (int i = 0; i < n; i++)
            scanf("%d", &mv[i]);
        sorted = mv;
        sort(sorted.begin(), sorted.end());
        for (int i = 0; i < n; i++)
            mv[i] = lower_bound(sorted.begin(), sorted.end(), mv[i]) - sorted.begin() + 1;
        printf("%d\n", info[mv]);
    }
}

댓글 없음:

댓글 쓰기