#include <bits/stdc++.h>
using namespace std;
vector<vector<long double>> v;
vector<vector<long double>> dp;
int n;
long double fun(int mask, int lastWin) {
  if (dp[mask][lastWin] != -1) return dp[mask][lastWin];
  if (mask & 1 == 0) {
    return dp[mask][lastWin] = 0;
  }
  dp[mask][lastWin] = 0;
  for (int i = 1; i <= n; i++) {
    if (i != lastWin && ((mask & (1 << (i - 1))) != 0))
      dp[mask][lastWin] =
          max(dp[mask][lastWin],
              v[lastWin - 1][i - 1] * fun(mask ^ (1 << (i - 1)), lastWin) +
                  v[i - 1][lastWin - 1] * fun(mask ^ (1 << (lastWin - 1)), i));
  }
  return dp[mask][lastWin];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  v.resize(n);
  for (int i = 0; i < n; i++) v[i].resize(n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) cin >> v[i][j];
  dp.resize(1 << n);
  for (int i = 0; i < (1 << n); i++) dp[i].resize(n + 1, -1);
  dp[1][1] = 1;
  if (n == 1) {
    cout << 1;
    return 0;
  }
  long double res = 0;
  int defMask = (1 << n) - 1;
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
      res = max(res, v[j - 1][i - 1] * fun(defMask ^ (1 << (i - 1)), j) +
                         v[i - 1][j - 1] * fun(defMask ^ (1 << (j - 1)), i));
    }
  }
  cout << setprecision(20) << res;
}
