Doby's Lab

[알고리즘] 백준 10819번: 차이를 최대로 (C++) 본문

PS/BOJ

[알고리즘] 백준 10819번: 차이를 최대로 (C++)

도비(Doby) 2021. 11. 28. 13:46

https://www.acmicpc.net/problem/10819

 

10819번: 차이를 최대로

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

www.acmicpc.net

범위가 8밖에 되지 않아서 백트래킹으로 나올 수 있는 수열들을 temp 배열에 담아 직관적으로 풀 수 있는 문제였다.

abs() == 절댓값 함수

#include <iostream>
#include <vector>
#include <cmath>
#define MAX 8 + 1
using namespace std;

vector<int> v;
vector<int> temp;
int n;
bool visited[MAX];
int maxValue = 0;

void sol(vector<int>& arr) {
	int sum = 0;
	for (int i = 0; i < n - 1; i++) {
		sum += abs(arr[i] - arr[i + 1]);
	}
	maxValue = max(sum, maxValue);
}

void backTrack(int cnt) {
	if (cnt == n) {
		sol(temp);
		/*
		for (int i = 0; i < temp.size(); i++) {
			cout << temp[i] << ' ';
		}
		cout << '\n';
		*/
	}

	for (int i = 0; i < n; i++) {
		if (!visited[i]) {
			visited[i] = 1;
			temp.push_back(v[i]);
			backTrack(cnt + 1);
			temp.pop_back();
			visited[i] = 0;
		}
	}
}

int main() {
	cin >> n;
	int value;
	for (int i = 0; i < n; i++) {
		cin >> value;
		v.push_back(value);
	}

	for (int i = 0; i < n; i++) {
		if (!visited[i]) {
			visited[i] = 1;
			temp.push_back(v[i]);
			backTrack(1);
			temp.pop_back();
			visited[i] = 0;
		}
	}

	cout << maxValue;

	return 0;
}
728x90