#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
#include<cstdio>
#include <cstring>
#include<bitset>
typedef long long ll;
using namespace std;
const int inf=1000001;
int f[inf],vis[inf],flag,n,prime[inf],cnt;
int dp[25][200000],a[25][25],q[200000];
int main()
{
int n;
while(cin>>n){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
int cnt=0;
int m=1<<n;//一个可以标记n个格子状态的二进制数
for(int i=0;i<m;i++)
{
if((i&(i<<1))==0) //与运算判断是否有相邻的1
q[cnt++]=i; //枚举状态
}
for(int i=0;i<n;i++)//枚举行
{
for(int j=0;j<cnt;j++)//枚举状态
{
int sum=0;
for(int k=0;k<n;k++)
{
if((q[j]&(1<<k))!=0)//判断在某状态下该格子是否被选取
sum+=a[i][k];
}
dp[i][j]=sum;
if(i>=1)
{
for(int k=0;k<cnt;k++)
{
if((q[j]&q[k])==0)//与运算判断相邻两行(与上一行)之间是否有同位置的1
{
dp[i][j]=max(dp[i][j],dp[i-1][k]+sum);//转移方程
}
}
}
}
}
int ans=0;
for(int i=0;i<cnt;i++)
{
ans=max(ans,dp[n-1][i]);
}
cout<<ans<<endl;
}
return 0;
}