PS/BOJ
10819
easy16
2022. 4. 30. 11:57
차이를 최대로 : https://www.acmicpc.net/problem/10819
|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|
DFS 인자에 누적하는 방식, i+1을 참조하도록 구현하면 IndexOutOfRange로 구현이 불가하여
i-1를 사용하고, 인자에 prev 값을 넘겨줘서 해당 부분(level 0)만 예외처리함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] arr;
static int answer;
static int[] ch;
static int N;
static boolean DBG =false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
ch = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
dfs(0, 0, 0);
System.out.println(answer);
}
private static void dfs(int level, int sum ,int prev) {
if (level == N) {
answer = Math.max(answer, sum);
} else {
for (int i = 0; i < N; i++) {
if (ch[i] == 0) {
ch[i] = 1;
//System.out.printf("%d-%d\n", prev, arr[i] );
int val = (level==0) ? 0 : Math.abs(prev - arr[i] );
dfs(level + 1, sum + val , arr[i]);
ch[i] = 0;
}
}
}
}
}
Backtrace
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] arr;
static int[] perm;
static int answer;
static int[] ch;
static int N;
static boolean DBG =false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
ch = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
perm = new int[N];
dfs(0);
System.out.println(answer);
}
private static void dfs(int level) {
if (level == N) {
if (DBG) {
for (int v : perm)
System.out.print(v + " ");
System.out.println();
}
int sum = 0;
for (int i = 0; i < N - 1; ++i) {
sum = sum + Math.abs(perm[i] - perm[i + 1]);
if (DBG)
System.out.printf("%d - %d ", perm[i], perm[i + 1]);
}
if (DBG)
System.out.println();
answer = Math.max(answer, sum);
} else {
for (int i = 0; i < N; i++) {
if (ch[i] == 0) {
ch[i] = 1;
perm[level] = arr[i];
dfs(level + 1);
ch[i] = 0;
}
}
}
}
}