#include <bits/stdc++.h>
int dr[] = {2, 2, -2, -2, 1, -1, 1, -1};
int dc[] = {1, -1, 1, -1, 2, 2, -2, -2};
int dr1[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dc1[] = {1, -1, 1, 0, -1, 0, 1, -1};
int dr2[] = {0, 0, 1, -1};
int dc2[] = {1, -1, 0, 0};
using namespace std;
double dp[20][300005], a[20][20];
long long vis[20][300005], n;
double cal(long long x, long long y) {
  if (y == 0) return (x == 0);
  if (vis[x][y]) return dp[x][y];
  vis[x][y] = 1;
  double &r = dp[x][y];
  for (long long i = 0; i < n; i++) {
    long long p = y & (1 << i);
    if (!p) continue;
    double r1 = cal(x, y ^ (1 << i)) * a[x][i];
    double r2 = cal(i, y ^ (1 << i)) * a[i][x];
    r = max(r1 + r2, r);
  }
  return r;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long tc, i, j, k, m;
  while (cin >> n) {
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) cin >> a[i][j];
    }
    if (n == 1) {
      cout << "1" << endl;
      continue;
    }
    double ans = 0;
    double p = (n * (n - 1)) * (.5);
    for (i = 0; i < n; i++) {
      for (j = i + 1; j < n; j++) {
        long long x = (1 << n) - 1;
        x ^= (1 << i);
        x ^= (1 << j);
        double r1 = cal(i, x) * a[i][j];
        double r2 = cal(j, x) * a[j][i];
        ans = max(ans, r1 + r2);
      }
    }
    cout << fixed << setprecision(12) << ans << endl;
  }
  return 0;
}
