백준알고리즘

스타트와 링크

먼지의삶 2019. 8. 8. 23:48
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int s[20][20];
int n;
int go(int index, vector<int>& a, vector<int>& b) {
	if (index == n) {
		if (a.size() != n / 2) return -1;
		if (b.size() != n / 2) return -1;
		int t1 = 0;
		int t2 = 0;
		for (int i = 0; i < n / 2; i++) {
			for (int j = 0; j < n / 2; j++) {
				if (i == j) continue;
				t1 += s[a[i]][a[j]];
				t2 += s[b[i]][b[j]];
			}
		}
		int diff = t1 - t2;
		if (diff < 0) diff = -diff;
		return diff;
	}
	if (a.size() > n / 2) return -1;
	if (b.size() > n / 2) return -1;
	int ans = -1;
	a.push_back(index);
	int t1 = go(index + 1, a, b);
	if (ans == -1 || (t1 != -1 && ans > t1)) {
		ans = t1;
	}
	a.pop_back();
	b.push_back(index);
	int t2 = go(index + 1, a, b);
	if (ans == -1 || (t2 != -1 && ans > t2)) {
		ans = t2;
	}
	b.pop_back();
	return ans;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> s[i][j];
		}
	}
	vector<int> a,b;
	cout << go(0, a, b) << "\n";
	return 0;

}

백트래킹 해서 문제풀기

재귀함수 잘못썼을때는 그냥 순열써서 풀었던기억이난다.

시간이 매우매우 많이 단축됨을확인할수있음