https://www.acmicpc.net/problem/16198
브루트포스로 문제가 분류되어 있는데
DFS 방식으로 숫자를 선택한 뒤에 계속 타고 들어가서 가장 큰 값을 업데이트 하는 식으로 해결했다.
x번째 숫자를 제거해서 다시 배열에 담을까도 생각을 해봤지만 숫자가 크지 않기 때문에
check함수를 이용해서 선택한 숫자를 제외한 다음 숫자를 왼쪽과 오른쪽 각각 구한 뒤에 곱해주는 식으로 접근했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <iostream> #include <algorithm> using namespace std; int N; int ans=0; int arr[11]={0}; int check[11]={0}; void dfs(int score,int cnt){ if(N-cnt<=2){ ans=max(ans,score); return; } for(int i=2;i<=N-1;i++){ if(check[i]) continue; check[i]++; int l=i,r=i; while(check[l]) --l; while(check[r]) ++r; dfs(score+(arr[l]*arr[r]),cnt+1); check[i]--; } } int main(){ scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&arr[i]); dfs(0,0); printf("%d\n",ans); return 0; } | cs |
'알고리즘(BOJ) > DFS' 카테고리의 다른 글
백준 15684번 - 사다리조작 (0) | 2019.08.18 |
---|---|
백준 3184번 - 양 (0) | 2019.08.08 |
백준 9521번 - 색칠 공부 (0) | 2019.06.18 |
백준 17136번 - 색종이 붙이기 (0) | 2019.04.14 |
백준 14502번 - 연구소 (0) | 2019.03.30 |