1244번 최대상금 - [S/W 문제해결 응용]
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15Khn6AN0CFAYD
이 문제는 이중 for문으로 완전탐색을 아주 그냥 돌려버렸다.
중복체크 안하고 돌리면 테스트케이스 7번까지는 돌아간다.
하지만 테스트케이스 8번부터 시간초과가 나버린다.
그러므로 중복체크 해야하므니다.
소스코드
xxxxxxxxxx// 1244 최대상금 - 완탐using namespace std;int T, seq;vector<int> v;int max_price;int check[1000000][11];int calc(){ int tmp = 0; for (int i = 0; i < v.size(); i++) tmp += (v[i] * pow(10, v.size() - i - 1)); return tmp;}void swap(int f,int s){ int first = v[f]; int second = v[s]; v[f] = second, v[s] = first;}void DFS(int n){ if (n >= seq) { max_price = max(max_price, calc()); return; } if (check[calc()][n]) return; // 이 두줄이 중복체크용 check[calc()][n] = 1; for (int i = 0; i < v.size(); i++) { for (int j = i+1; j < v.size(); j++) { swap(i, j); DFS(n + 1); swap(i, j); } }}void input(){ cin >> T; for (int i = 1; i <= T; i++) { string tmp; cin >> tmp >> seq; for (int j = 0; j < tmp.size(); j++) v.push_back(tmp[j] - '0'); DFS(0); cout << "#" << i << " " << max_price; max_price = 0; v.clear(); }}int main(){ input(); return 0;}
'알고리즘 > 완전탐색' 카테고리의 다른 글
| 완전탐색 - Brute Force Search (0) | 2018.04.02 |
|---|---|
| 완전탐색 - 비트마스크 기초 (0) | 2018.03.30 |
| 일곱난쟁이 2309번 - 완탐(순열) (0) | 2018.03.22 |
| 로또 6603번 - 순열 (0) | 2018.03.22 |
| 백준 - 숨바꼭질 1697번 - 완전탐색(BFS) (2) | 2018.03.09 |