#pragma GCC optimaze("Ofast")
#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;
const int MSIZE = 16;
int g[MSIZE][MSIZE];
long long Precalc[1 << MSIZE];
vector<int> indexes[1 << MSIZE];
long long dp[1 << MSIZE];
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> g[i][j];
        }
    }
    for (int mask = 0; mask < (1 << n); mask++) {
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if ((mask >> i) & (mask >> j) & 1) {
                    Precalc[mask] += g[i][j];
                }
            }
        }
        for (int i = 0; i < n; i++) {
            if (((mask >> i) & 1) == 0) {
                indexes[mask].push_back(i);
            }
        }
    }
    vector<pair<int,int> > masks(1 << n);
    for (int mask = 0; mask < (1 << n); mask++) {
        masks[mask] = make_pair(__builtin_popcount(mask), mask);
    }
    sort(all(masks));
    for (int i = 0; i < (1 << n); i++) {
        int mask = masks[i].second;
        int sz = indexes[mask].size();
        for (int mask2 = 1; mask2 < (1 << sz); mask2++) {
            int curMask = 0;
            for (int i = 0; i < sz; i++) {
                if ((mask2 >> i) & 1) {
                    curMask |= (1 << indexes[mask][i]);
                }
            }
            dp[mask | curMask] = max(dp[mask] + Precalc[curMask], dp[mask | curMask]);
        }
    }
    cout << dp[(1 << n) - 1] << endl;
}
