SORTGAME를 알고리즘 문제해결 전략 책의 코드로 했는데 시간초과 떠요.. swqasw 알고리즘 문제해결 전략의 코드 29.4를 이용해서 문제를 풀었습니다. 책에서는 n=8인 경우에도 40320개의 상태만 방문하면 되므로 precalc() 수행시간이 오래걸리지 않는다고 적혀있습니다. 그런데 코드 작성 후 돌려보니 n=8일때 맵 만드는데 한참 걸립니다. 이유가 무엇인지 알려주시면 감사하겠습니다. 아래 코드는 책보고 따라한 코드 #include <iostream> #include <vector> #include <algorithm> #include <queue> #include <map> using namespace std; map<vector<int>, int> toSort; void precalc(int n) { vector<int> perm(n); for (int i = 0;i < n;i++) perm[i] = i; queue<vector<int> > q; q.push(perm); toSort[perm] = 0; while (!q.empty()) { vector<int> here = q.front(); q.pop(); int cost = toSort[here]; for (int i = 0;i < n;i++) { for (int j = i + 2;j <= n;j++) { reverse(here.begin() + i, here.begin() + j); if (toSort.count(here) == 0) { toSort[here] = cost + 1; q.push(here); } reverse(here.begin() + i, here.begin() + j); } } } } int solve(const vector<int>& perm) { int n = perm.size(); //sort(perm, perm + n); vector<int> fixed(n); for (int i = 0;i < n;i++) { int smaller = 0; for (int j = 0;j < n;j++) { if (perm[j] < perm[i]) ++smaller; } fixed[i] = smaller; } return toSort[fixed]; } int main() { int testCase; cin >> testCase; vector<int> result(testCase); for (int i = 0;i < testCase;i++) { int n; cin >> n; vector<int> perm(n); for (int j = 0;j < n;j++) cin >> perm[j]; toSort.clear(); precalc(n); result[i] = solve(perm); } for (int i = 0;i < testCase;i++) { cout << result[i] << endl; } return 0; } 7년 전
1개의 댓글이 있습니다. sgchoi5 for (int i = 1; i <= 8; i++) precalc(i); 를 testCase for 문 전에 미리 해주시면 됩니다. 전처리 후 각 testcase 에서 사용하는 것입니다. 5년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
swqasw
알고리즘 문제해결 전략의 코드 29.4를 이용해서 문제를 풀었습니다.
책에서는 n=8인 경우에도 40320개의 상태만 방문하면 되므로 precalc() 수행시간이 오래걸리지 않는다고 적혀있습니다.
그런데 코드 작성 후 돌려보니 n=8일때 맵 만드는데 한참 걸립니다.
이유가 무엇인지 알려주시면 감사하겠습니다.
아래 코드는 책보고 따라한 코드
7년 전