Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 10819 차이를 최대로 (c++) : 피너클 본문

백준

백준 10819 차이를 최대로 (c++) : 피너클

피너클 2022. 9. 28. 13:09
728x90
반응형

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

 

10819번: 차이를 최대로

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

www.acmicpc.net

백트래킹 문제다.

cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
memset(visited, false, sizeof(visited));
int ans = solve(vector<int>());
cout << ans << '\n';

n을 입력받고 값들을 입력받은뒤 visited를 초기화한다.

그후 ans에 solve함수를 돌려 답을 넣고 출력하면 된다.

int solve(vector<int> v) {
	if (v.size() == n) {
		int ans = 0;
		for (int i = 0; i < n-1; i++) ans += abs(v[i] - v[i + 1]);
		return ans;
	}

solve함수다. v는 무작위로 섞인 배열이 담겨있다.

만약 v의 크기가 n과 같다면 모든 계산을 한뒤 ans를 반환한다.

	int ans = 0;
	for (int i = 0; i < n; i++) {
		if (!visited[i]) {
			visited[i] = true;
			v.push_back(arr[i]);
			ans = max(ans, solve(v));
			v.pop_back();
			visited[i] = false;
		}
	}
	return ans;
}

아니라면 배열을 섞어야한다. int ans를 준비해준다.

0부터 n까지를 돌며 만약 아직 방문하지 않았다면 

v에 넣고 solve를 돌린뒤 다시 빼준다. 그후 ans를 반환해준다.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

int n;
int arr[9];
bool visited[9];

int solve(vector<int> v) {
	if (v.size() == n) {
		int ans = 0;
		for (int i = 0; i < n-1; i++) ans += abs(v[i] - v[i + 1]);
		return ans;
	}
	int ans = 0;
	for (int i = 0; i < n; i++) {
		if (!visited[i]) {
			visited[i] = true;
			v.push_back(arr[i]);
			ans = max(ans, solve(v));
			v.pop_back();
			visited[i] = false;
		}
	}
	return ans;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	for (int i = 0; i < n; i++) cin >> arr[i];
	memset(visited, false, sizeof(visited));
	int ans = solve(vector<int>());
	cout << ans << '\n';
}

전체코드다.

728x90
반응형
Comments