#include<iostream>
using namespace std;
const int Max = 21;//const限定符,它把一个对象转换为一个常量
const bool A = true;//布尔型,真/假 //输入定义A B两集合,A为原节点集合,B为依次拿出这些点,所放到的集合
const bool B = false;
int n, map[Max][Max], ans = 0; //输入定义最大权值(数组?)(集合?)
bool set[Max];//set定义集合
void dfs(int dep, int sum){ //void声明任意类型,定义dfs算法
if(dep > n){ //剪枝
if(sum > ans) //递归, 猴子摘桃问题
ans = sum; //ans为最大权值,即最远距离
return; //
}
int i, m;
m = 0;
set[dep] = A; //A集合
for(i = 1; i <= dep; i ++)
if(set[i] == B) //
m += map[i][dep]; //dep与i在不同集合减去两点间的权
dfs(dep + 1, sum + m); //dfs算法—递归
m = 0;
set[dep] = B; //B集合
for(i = 1; i <= dep; i ++)
if(set[i] == A) //
m += map[i][dep];
dfs(dep + 1, sum + m);
}
int main(){
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
cin >> map[i][j]; //输出
dfs(1, 0); //
cout << ans << endl; //输出ans
return 0;
}