#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int board[21][21] = { 0, }; //능력치 저장 보드
int board_size; //보드의 크기
int low = 100; //제일 적은 오차의 크기
int flag[21] = { 0, }; //해당 인원의 소속 여부 확인용
vector <int> start; //start팀의 구성
vector <int> link; //link팀의 구성
void team(int a, int d) //팀 선정 후 능력치 차이 확인
{
if (a == board_size / 2) //link팀 선정 후 능력치 차이 확인
{
int S = 0; //start팀의 총 능력치
int L = 0; //link팀의 총 능력치
for (int i = 1; i <= board_size; i++)
{
if (!flag[i]) link.push_back(i); //팀에 소속하지않은 인원들을 link에 소속시키기
}
for (int i = 0; i < board_size / 2; i++)
{
for (int j = 0; j < board_size / 2; j++)
{
S += board[start[i]][start[j]]; //start팀의 능력치 점수
L += board[link[i]][link[j]]; //linck팀의 능력치 점수
}
}
if (abs(S - L) < low) //능력치 점수의 차이
low = abs(S - L);
if (!low) //low값이 0이면 더이상 능력치 점수의 차이가 발생하지않는다는 것이기에 프로그램 종료
{
cout << low;
exit(0);
}
link.clear(); //link 벡터 전체 초기화
return;
}
for (int i = d; i <= board_size; i++) //start팀만 소속 진행
{
if (flag[i]) continue; //팀에 소속된 인원 제외
flag[i] = true; //팀에 소속됨
start.push_back(i); //start팀에 소속
team(a + 1, i + 1);
start.pop_back(); //다른 인원 소속을 위해 제외
flag[i] = false; //팀에 소속이 안됨
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> board_size;
for (int i = 1; i <= board_size; i++)
{
for (int j = 1; j <= board_size; j++)
{
cin >> board[i][j];
}
}
team(0, 1);
cout << low;
return 0;
}