#include <bits/stdc++.h>
using namespace std;
int countBits(int n) {
  int nOn = 0;
  for (int i = (0); i < (32); ++i)
    if ((n & (1 << i)) != 0) nOn++;
  return nOn;
}
int getSelected(int n, int id) {
  int nOn = 0;
  id++;
  for (int i = (0); i < (30); ++i) {
    if ((n & (1 << i)) != 0) {
      nOn++;
      if (nOn == id) return i;
    }
  }
  assert(false);
  exit(0);
  return -1;
}
int main() {
  ios_base::sync_with_stdio(0);
  cout.precision(10);
  int n;
  cin >> n;
  vector<vector<double>> p(n, vector<double>(n));
  for (int i = (0); i < (n); ++i)
    for (int j = (0); j < (n); ++j) cin >> p[i][j];
  int nParts = 1 << n;
  vector<list<int>> parts(n + 1);
  for (int part = (0); part < (nParts); ++part) {
    if (part % 2 == 0) continue;
    int nOn = countBits(part);
    if (nOn >= parts.size()) {
      cout << "part"
           << " = " << part << "\n";
      cout << "nOn"
           << " = " << nOn << "\n";
      assert(false);
      exit(0);
    }
    parts[nOn].push_back(part);
  }
  int nCombis = nParts + ((n - 1) << n);
  vector<double> pWin(nCombis);
  for (int nOn = (1); nOn < (n + 1); ++nOn) {
    for (int part : parts[nOn]) {
      if (nOn == 1) {
        assert(part == 1);
        pWin[part] = 1;
      } else {
        for (int selectId = (1); selectId < (nOn); ++selectId) {
          int select = getSelected(part, selectId);
          int combi = part + (select << n);
          double bestPWin = 0;
          for (int select2Id = (nOn == 2 ? 0 : 1); select2Id < (nOn - 1);
               ++select2Id) {
            int select2 = getSelected(part ^ (1 << select), select2Id);
            int combi21 = (part ^ (1 << select2)) + (select << n);
            int combi22 = (part ^ (1 << select)) + (select2 << n);
            double currPWin = p[select][select2] * pWin[combi21] +
                              p[select2][select] * pWin[combi22];
            if (currPWin > bestPWin) bestPWin = currPWin;
          }
          pWin[combi] = bestPWin;
        }
      }
    }
  }
  int completePart = parts[n].front();
  double bestPWin = 0;
  for (int selectId = (0); selectId < (n); ++selectId) {
    int select = getSelected(completePart, selectId);
    int combi = completePart + (select << n);
    if (pWin[combi] > bestPWin) bestPWin = pWin[combi];
  }
  cout << bestPWin << "\n";
  return 0;
}
