#include <bits/stdc++.h>
using namespace std;
#define int long long
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
int N;
int a[20][20];
int dp[1<<16]; // dp[i]: iの立っているビットを使用したときの組み合わせの数
int USE[1<<16]; // USE[i]: iで立ってるビットを同じグループとしたときのスコア
signed main() {
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%lld", &a[i][j]);
}
}
// 使用したビットに対応するスコアをあらかじめ計算しておく
for (int use = 0; use < (1 << N); use++) {
int score = 0;
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) {
if (((use >> i)&1) and ((use >> j)&1)) {
score += a[i][j];
}
}
}
USE[use] = score;
}
// DP
for (int used = 0; used < (1 << N); used++) { // 使用済みのビット
int unused = used ^ ((1 << N) - 1); // 未使用のビット
for (int use = unused; use > 0; use=(use-1)&unused) { // unusedの部分集合を列挙
if (!(use > used)) continue;
chmax(dp[use | used], dp[used] + USE[use]);
}
}
cout << dp[(1<<N)-1] << endl;
return 0;
}