#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = (1 << 16) + 5;
int arr[16][16];
int n;
ll val[N];
vector<int> m[N];
void get_masks(int idx, int mask, int pos)
{
  if(idx == n)
  {
    if(mask)
      m[pos].push_back(mask);
    return;
  }
  get_masks(idx + 1, mask, pos);
  if(mask & (1 << idx))
    get_masks(idx + 1, mask ^ (1 << idx), pos);
}
ll dp[N];
ll solve(int mask)
{
  if(mask == (1 << n) - 1)
    return 0;
  ll &ans = dp[mask];
  if(~ans)
    return ans;
  ans = 0;
  for(auto &x: m[mask])
  {
    ans = max(ans, solve(mask | x) + val[x]);
  }
  return ans;
}
int main()
{
  cin >> n;
  for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
      cin >> arr[i][j];
  for(int i = 0; i < (1 << n); i++)
  {
    for(int j = 0; j < n; j++)
    {
      for(int k = j + 1; k < n; k++)
      {
        if((i & (1 << j)) && (i & (1 << k)))
          val[i] += arr[j][k];
      }
    }
  }
  for(int i = 0; i < (1 << n); i++)
  {
    int newMask = i;
    for(int j = 0; j < n; j++)
      newMask ^= (1 << j);
    get_masks(0, newMask, i);
  }
  memset(dp, -1, sizeof dp);
  cout << solve(0);
  return 0;
}
