https://www.acmicpc.net/problem/16198
16198번: 에너지 모으기
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있
www.acmicpc.net
저는 dfs를 통해 문제를 해결하였습니다.
dfs를 통해 각각 선택하고 visited로 해당 요소가 지워졌는지를 표시하였습니다.
이전과 다음은 visited아 아닌것이 나올 때까지 증가 감소 시켜 인덱스를 찾았습니다.
package BOJ.dfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_16198 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int[] input = new int[n];
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < n ; i++){
input[i] = stoi.apply(st.nextToken());
}
boolean[] visited = new boolean[n];
int result = dfs(n-2,input,visited);
System.out.println(result);
}
private static int dfs(int depth, int[] input, boolean[] visited) {
if(depth == 0){
return 0;
}
int result = 0;
for(int i = 1 ; i < input.length-1 ; i++){
if(visited[i]){
continue;
}
visited[i] = true;
int next = findNext(input,i,visited);
int prev = findPrev(input,i,visited);
result = Math.max(result,next * prev + dfs(depth-1,input,visited));
visited[i] = false;
}
return result;
}
private static int findPrev(int[] input, int i, boolean[] visited) {
while(visited[i]){
i++;
}
return input[i];
}
private static int findNext(int[] input, int i, boolean[] visited) {
while(visited[i]){
i--;
}
return input[i];
}
}
'알고리즘' 카테고리의 다른 글
백준 9658번 돌 게임4 (JAVA) (0) | 2022.07.28 |
---|---|
백준 2688번 줄어들지 않아 (JAVA) (0) | 2022.07.27 |
백준 14248번 점프 점프 (JAVA) (0) | 2022.07.25 |
백준 16174번 점프왕 쩰리(JAVA) (0) | 2022.07.24 |
백준 16724번 피리 부는 사나이 (JAVA) (0) | 2022.07.23 |