#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
#include<set>
#include<climits>
#include<cstring>
using namespace std;
//=============struct declaration==============
//=============var declaration=================
const int maxn=14+10;
long long a[2*maxn][2*maxn];
bool f[2*maxn];
long long n,k,cnt,ans;
vector<long long> q1,q2;
//=============function declaration============
void dfs(long long x,long long team1n,long long team2n,long long totv);
//=============main code=======================
int main()
{
//freopen("tt.in","r",stdin); 退役OIer
//freopen("tt.out","w",stdout);
cin>>n;
for(int i=1; i<=2*n; i++)
for(int j=1; j<=2*n; j++)
{
cin>>a[i][j];
}
dfs(1,0,0,0);
cout<<ans<<endl;
return 0;
}
//=============function code===================
void dfs(long long x,long long team1n,long long team2n,long long totv)//决定第x个人的归属,队1有team1n个人了,队2有team2n个人了,目前总竞争值为totv
{
if(x>2*n)//所有人都选完了
{
if(totv>ans)//更新最大值
ans=totv;
return;
}
if(team1n<n)//两种情况进队1,进队2,满了就别进了
{
q1.push_back(x);
vector<long long>::iterator it;
long long t=0;
for(it=q2.begin(); it!=q2.end(); it++)//进一个人就更新总竞争值
{
t+=a[x][*it];
}
dfs(x+1,team1n+1,team2n,totv+t);
q1.pop_back();
}
if(team2n<n)
{
q2.push_back(x);
vector<long long>::iterator it;
long long t=0;
for(it=q1.begin(); it!=q1.end(); it++)
{
t+=a[x][*it];
}
dfs(x+1,team1n,team2n+1,totv+t);
q2.pop_back();
}
}